快速排序
一、介紹
快速排序和合併排序有點類似,兩者可以相互比較。快速排序也是像合併排序那樣將整個序列分成兩段分別進行排序。但是快速排序沒有合併排序的合併過程。
該演算法是1960 年c.a.r.hoard提出的乙個非常好的排序演算法。快速排序演算法需要選擇乙個劃分元素,把小於劃分元素的元素放在它的左邊,大於它的元素放在右邊,這樣就分成了左右兩端,在對左右兩段進行排序。
從上面可以得出,劃分元素的選擇是乙個瓶頸。演算法的效率取決於劃分元素的選擇。
二、實現
這裡只給出快速排序的遞迴實現,該演算法由兩個函式組成,乙個是劃分函式,另外乙個是遞迴處理函式。
(1)劃分函式
/*劃分函式*/
//s和t是劃分段的起止下標,k是劃分元素最終位置
void partition(int a, int s,int t,int &k)
; int len=sizeof(a)/sizeof(int);
quick_sort(a,0,len-1);
printf("排序後為:\n");
for(int i=0;i
三、複雜性
快速排序的平均複雜度和合併排序是一樣的,都是o(n*log(n))
,但是最壞情況下為o(n2)
,這和氣泡排序是一樣的。很明顯,最壞的情況是輸入資料是已經排好序的,但是在實際情況下很少出現這樣的情況。
三、應用
(1)為什麼用快速排序
1.因為快速排序的遞迴實現很簡單
2.在一般情況下,快速排序的速度和合併排序一樣,都是o(n*log(n))
3.該方法不需要合併過程
(2)為什麼不用快速排序
1.因為在最壞情況下,該方法和氣泡排序一樣,很慢
2.迭代的實現很困難。
3.對於某些資料型別,有其他更快的排序方法。
總結:
輸入資料次序越亂,所選劃分元素值的隨機性越好,排序速度越快,反之,輸入資料越有序,排序速度越慢,可見快速排序不是一種自然的排序演算法。
即使採用前面介紹的選取中值的方法,也無法保證劃分產生的子2問題大小完全平衡。至多能改變演算法平均的時間效能,無法改變最壞情況的時間效能。在最壞情況下,快速排序的時間複雜度總是o(n2)
。 複製
搜尋 複製搜尋
排序演算法總結(快速排序)
終於不用改 了,希望文章大修順利!穩定的演算法 不穩定的演算法 內部排序 排序過程不涉及內 外存交換 外部排序 排序過程有內 外存交換 in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基...
排序演算法總結 快速排序
快速排序的一般步驟如下 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。來自於 啊哈!演算法 這裡需要解釋一下為什麼每次交換的時候都需要右邊的哨兵先走 最主要是相遇點的問題,演算法的...
排序演算法總結 快速排序
前面說的氣泡排序是一種交換排序。交換排序還有一種演算法,就是快速排序演算法。快速排序的核心思想是分而治之。意思就是選出乙個基準 可以是第乙個元素,也可以是最後乙個。為了方便我們選取第乙個 將小於這個基準的全部元素都放在這個基準的左邊,大於這個基準的全部元素都放在基準的右邊。然後分別對左右兩個陣列在進...