快速排序演算法-分治思想
以下內容全部轉載自:http://www.cnblogs.com/luchen927/archive/2012/02/29/2368070.html
今天介紹快速排序,這也是在實際中最常用的一種排序演算法,速度快,效率高。就像名字一樣,快速排序是最優秀的一種排序演算法。
思想
快速排序採用的思想是分治思想。
快速排序是找出一個元素(理論上可以隨便找一個)作為基準(pivot),然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正 確位置,排序完成。所以快速排序演算法的核心演算法是分割槽操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞迴。
舉例說明一下吧,這個可能不是太好理解。假設要排序的序列為
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移動到後面
2 1 4 9 3 6 7 4 5 比較2和7,2和6,2和3,2和9,全部大於2,滿足條件,因此不變
經過第一輪的快速排序,元素變為下面的樣子
[1] 2 [4 9 3 6 7 5]
之後,在把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)
在最好情況下,每次劃分所取的基準都是當前無序區的"中值"記錄,劃分的結果是基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數:O(nlgn)
儘管快速排序的最壞時間為O(n2),但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快者,快速排序亦因此而得名。它的平均時間複雜度為O(nlgn)。