快速排序 代碼

參考:http://www.cnblogs.com/luchen927/archive/2012/02/29/2368070.html
快速排序採用的思想是分治思想。

舉例說明一下吧,假設要排序的序列爲html

2 2 4 9 3 6 7 1 5 首先用2看成基準,使用i j兩個指針分別從兩邊進行掃描,把比2小的元素和比2大的元素分開。首先比較2和5,5比2大,j左移算法

2 2 4 9 3 6 7 1 5 比較2和1,1小於2,因此把1放在2的位置性能

2 1 4 9 3 6 7 1 5 比較2和4,4大於2,所以將4移動到後面ui

2 1 4 9 3 6 7 4 5 比較2和7,2和6,2和3,2和9,所有大於2,知足條件,所以不變指針

通過第一輪的快速排序,元素變爲下面的樣子htm

[1] 2 [4 9 3 6 7 5]blog

以後,在把2左邊的元素進行快排,因爲只有一個元素,所以快排結束。右邊進行快排,遞歸進行,最終生成最後的結果。排序


int quicksort(vector<int> &v, int left, int right){
if(left < right){
int key = v[left];
int low = left;
int high = right;
while(low < high){
while(low < high && v[high] > key){
high--;
}
v[low] = v[high];
while(low < high && v[low] < key){
low++;
}
v[high] = v[low];
}
v[low] = key;
quicksort(v,left,low-1);
quicksort(v,low+1,right);
}
}

      快速排序的時間主要耗費在劃分操做上,對長度爲k的區間進行劃分,共需k-1次關鍵字的比較。遞歸

      最壞狀況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間爲空(或右邊的子區間爲空),而劃分所得的另外一個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減小一個。時間複雜度爲O(n*n)sort

      在最好狀況下,每次劃分所取的基準都是當前無序區的"中值"記錄,劃分的結果是基準的左、右兩個無序子區間的長度大體相等。總的關鍵字比較次數:O(nlgn)

儘管快速排序的最壞時間爲O(n2),但就平均性能而言,它是基於關鍵字比較的內部排序算法中速度最快者,快速排序亦所以而得名。它的平均時間複雜度爲O(nlgn)。

相關文章
相關標籤/搜索