快速排序演算法

2021-06-29 10:54:00 字數 2665 閱讀 4965

快速排序演算法最早由圖靈獎獲得者tony hoare設計出來的,他在形式化方法理論以及algol60程式語言的發明中都有卓越的貢獻,是上世紀最偉大的計算機科學家之一。

時間複雜度:o(n*lgn)

最壞:o(n^2)

空間複雜度:o(n*lgn)

不穩定。

要注意很多細節問題,如:

我們知道,快速排序的分治partition過程有兩種方法,一種方法是兩個指標從首尾位分別向中間掃瞄的方法(大多數的人和一般的教材採用的是這第二種首尾向中間掃瞄法,演算法導論的思考題7-1,p103頁),這種方式是hoare的最原始設計思想,俗稱hoare版本,需要注意的是partition操作裡面一定要從右面開始,即,while(ldata[h]>=pivot)h--;

***x;

while(ldata[l]<=pivot)l++;

***x; 的順序結構。另外

一種是上面所述的兩個指標索引一前一後逐步向後掃瞄的方法(演算法導論

p95頁上採用的是這種方法)

partition過程中,要注意一些邊界值問題。如i、j索引的初始化,for迴圈中,j從陣列中第乙個位置到倒數第二個位置h-1處,且是當data[j]<=privot(是小於等於,非小於),然後找到了之後,i++,再交換。最後還有一次data[i+1]與data[h]的交換。最後,便是返回值的問題,返回i+1。

第三個要注意的方面是遞迴處。if(l

主要要注意的問題就是上述三個方面。只要把握好細節,那麼快速排序演算法,二十幾行自能搞定。

對於版本一可以引用 的,這樣更容易理解。

版本一偽**(hoare版本)

hoare-partition(a, p, r)

1 x ← a[p]

2 i ← p - 1

3 j ← r + 1

4 while true

5 do repeat j ← j - 1

6 until a[j] ≤ x

7 repeat i ← i + 1

8 until a[i] ≥ x

9 if i < j

10 then exchange a[i] ↔ a[j]

11 else return j

版本二偽**:

quicksort(a, p, r)

1 if p < r

2 then q ← partition(a, p, r) //關鍵

3 quicksort(a, p, q - 1)

4 quicksort(a, q + 1, r)

陣列劃分

快速排序演算法的關鍵是partition過程,它對a[p..r]進行就地重排:

partition(a, p, r)

1 x ← a[r]

2 i ← p - 1

3 for j ← p to r - 1

4 do if a[j] ≤ x

5 then i ← i + 1

6 exchange a[i] <-> a[j]

7 exchange a[i + 1] <-> a[r]

8 return i + 1

下面是實際的**(可執行,我在code::blocks執行成功)

這幾種方式在於分割槽操作的不同而已,其他都相同。

partition1:是原始的hoare版本,即兩個指標分別由首尾向中間進行掃瞄

partition1_1:是原始hoare版本的另一版本,同理上面

partition2:是後來的改版,即兩個指標索引從首部一前一後逐步向後掃瞄

可以將 quicksort函式中的分割槽操作由上面的這幾種方式代替即可。

#include #include using namespace std;

void swap(int* a,int* b)

int partition2(int data,int l,int h){

int i=l-1,j;

int pivot = data[h];

for(j=l;j=pivot)h--;

data[l]=data[h];

while(l=pivot)h--;

swap(&data[l],&data[h]);

while(l如果未來我看不懂**啦,請自己去看演算法導論!一定能看懂

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

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

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

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

演算法設計 快速排序 隨機快速排序演算法

1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...