快速排序演算法最早由圖靈獎獲得者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 利用代入法可以求...