我們知道快排的一般步驟是:
1.選取最左邊的數為基準數;
2.從右邊開始選取乙個小於基準數的元素;
3.從左邊開始選取乙個大於基準數的元素;
4.交換這兩個元素;
5.重複2、3、4步直至左右兩邊移到同一位置,交換基準數與當前元素
void
quick_sort
(int
*begin,
int*end)
*left =
*begin;
*begin = pos_x;
quick_sort
(left, begin -1)
;quick_sort
(begin +
1, right)
;}
我們發現上面的**進行了多次swap,所以我們可以進行優化,如下:
void
quick_sort
(int
*begin,
int*end)
*begin = pos_x;
//最後將基準值歸位
quick_sort
(left, begin -1)
;quick_sort
(begin +
1, right)
;}
由於快排在某些情況下的時間複雜度會退化成o(n2n^
n2)比如在有序的情況下,我們以最左值作為基準的話,就會使演算法退化成o(n2n^
n2)這時我們可以選擇採用隨機選擇基準值或者選擇中間元素為基準值的方法去解決。
同時,我們可以選擇雙路遍歷序列的方式來使快排更加穩定
void
quick_sort
(int
*begin,
int*end)}if
(left < end)
quick_sort
(left, end);if
(begin < right)
quick_sort
(begin, right)
;}
雙路快速排序
雙路快速排序的時間複雜度為o nlog2n 空間複雜度為o n 雙路快速排序的核心思想 單路快排會將等於v的元素分配在左側或者右側,當陣列中有大量重複元素時,這將會導致左右兩側的元素數量極度不均衡,時間複雜度退化到o n 2 如下圖所示 雙路快排是將等於v的部分近乎平均的分配在左右兩側,避免了該問題...
C 實現快速排序 雙路快速排序 三路快速排序
從左向右依次遞迴 如果 陣列中的元素都相等,就會變成 n 級別的複雜度演算法 public class quicksort public static void sort t arr where t system.icomparable public static void sort2 t arr ...
高階排序演算法之雙路快速排序
對於具有大量重複資料的排序按照之前的方式效能會很低,現在我們增加兩個標誌,想辦法把大量重複的資料分到兩部分,例如設定v作為標誌資料,讓等於v的資料分為兩部分,如下圖所示,這樣可以避免兩邊的資料出現一邊倒的情況。根據以上演算法的思想,修改如下 雙路快速排序演算法 解決具有大量重複源資料排序慢的問題 t...