排序演算法 快速排序

2022-09-16 03:03:12 字數 1735 閱讀 3335

快速排序具有最好的平均效能(**erage beh**ior),但最壞效能(worst case beh**ior)和插入排序

相同,也是o(n^2)。比如乙個序列5,4,3,2,1,要排為1,2,3,4,5。按照快速排序方法,每次只會有乙個資料進入正確順序,不能把資料分成大小相當的兩份,很明顯,排序的過程就成了乙個歪脖子樹,樹的深度為n,那時間複雜度就成了o(n^2)。儘管如此,需要排序的情況幾乎都是亂序的,自然效能就保證了。據書上的測試圖來看,在資料量小於20的時候,插入排序具有最好的效能。當大於20時,快速排序具有最好的效能,歸併(merge sort)和堆排序(heap sort)也望塵莫及,儘管複雜度都為nlog2(n)。

1、演算法思想

快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。

(1) 分治法的基本思想

分治法的基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

(2)快速排序的基本思想

設當前待排序的無序區為r[low..high],利用分治法可將快速排序的基本思想描述為:

①分解:

在r[low..high]中任選乙個記錄作為基準(pivot),以此基準將當前無序區劃分為左、右兩個較小的子區間r[low..pivotpos-1)和r[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄(不妨記為pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。

注意:劃分的關鍵是要求出基準記錄所在的位置pivotpos。劃分的結果可以簡單地表示為(注意pivot=r[pivotpos]):

r[low..pivotpos-1].keys≤r[pivotpos].key≤r[pivotpos+1..high].keys

其中low≤pivotpos≤high。

②求解:

通過遞迴呼叫快速排序對左、右子區間r[low..pivotpos-1]和r[pivotpos+1..high]快速排序。

③組合:

因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

快速排序c++**實現:

#include#includeusing namespace std;

int quicksort(int *a, int low, int high)

a[low] = a[high];

while (low < high&&a[low] <= key)//這裡要取等號不然會陷入死迴圈

a[high] = a[low];

} a[low] = key;

return low;

}void qsort(int *a, int low, int high)

}int main()

; qsort(a, 0, 10);

for (int i = 0; i < 11; i++)

return 0;

}

快速排序最壞情況是,把乙個降序的數列變為公升序序列或者公升序序列變為降序序列,最好情況每次劃分過程產生的區間大小都為n/2

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

演算法 排序演算法 快速排序

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...

排序演算法 快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分...