天天看點

快速排序

針對冒泡排序我們進行一次優化,就引進了快速排序在此基礎上進行優化

任取一個記錄(如第一個)作為 樞軸或支點,設其關鍵字為pivotkey。

在一趟排序後,所有比它小的記錄一律前放,比它大的記錄一律後放,形成左右兩個子表,将樞軸放在分界處的位置;

然後,分别對各子表重新選擇樞軸,并依此規則調整,直到每個子表的元素隻剩一個,排序完成。

(1)附設兩個指針low和high,初始時分别指向表的上限和下限,設樞軸記錄的關鍵字為pivotkey(第一趟時,low=1,high=l.length)

(2)從表的最右側位置,依次向左搜尋找到第一個關鍵字小于pivotkey的記錄和樞軸記錄交換。具體操作:當

low<code>&lt;</code>high時,若high所指紀錄的關鍵字大于等于pivotkey,則向左移動指針high(即–high),否則high所指紀

錄與樞軸紀錄交換。

(3)然後再從表的左側位置,依次向右搜尋第一個關鍵字大于pivotkey的記錄和樞軸記錄交換。具體操作:當low<code>&lt;</code>high時,若low所指記錄的關鍵字小等于pivotkey,則向右移動指針low(即++low),否則low所指記錄與樞軸記錄交換。

(4)重複(2)(3)步驟,直到low和high相等為止,此時low或high的位置即為樞軸在此趟排序中的最終位置,原表被分成兩個子表。

快速排序
快速排序

每一趟的子表的形成是采用從兩頭向中間交替式逼近法;

由于每趟中對各子表的操作都相似,可采用遞歸算法。

算法分析可以證明,平均計算時間是o(nlog2n)。

實驗結果證明:就平均計算時間而言,快速排序是我們所學習的所有内排序方法中最好的一個。

快速排序是遞歸的,需要有一個棧存放每層遞歸調用時參數(新的low和high)。

最大遞歸調用層次數與遞歸樹的深度一緻,是以要求存儲開銷為o(log2n)。

最好:劃分後,左側右側子序列的長度相同

最壞:從小到大排好序,遞歸樹成單支樹,每次劃分隻得到一個比上一次少一個對象的子序列,必須經過n-1

趟才能把所有對象定位,而且第i趟需要經過n-i次關鍵碼比較才能找到第i個對象的安放位置

時間效率:o(nlog2n)—-每趟确定的元素呈指數增加

空間效率:o(log2n)—–遞歸要用到棧空間

穩定性:不穩定—–可選任一進制素為支點。

下一篇: 冒泡排序

繼續閱讀