排序優化 模擬棧及三路快排

2022-09-05 18:54:11 字數 986 閱讀 7109

幾乎所有的程式語言都會提供排序函式,比如 c 語言的 qsort(), c++ stl 中的 sort(),這些排序函式是如何實現的呢?

如果要實現乙個通用的高效率的排序函式,我們應該選擇那種排序演算法呢?

快速排序最壞情況下時間複雜度退化為 \(o(n^2)\) ,我們怎樣來避免這種情況的發生呢?

2.1. 分割槽點優化問題

2.2. 堆疊溢位問題

快速排序是利用遞迴來實現的,當遞迴的的深度過深時,就會導致堆疊溢位。

int partition(float data, int left, int right)

}data[j] = data[i];

data[i] = pivot;

return i;

}void quick_sort(float data, int left, int right)

if (j > mid+1)}}

}

針對有重複資料的情況,三路劃分將資料分為三部分:小於主元的、等於主元的和大於主元的,然後遞迴呼叫的時候只對兩端的資料再排序,而不用處理中間相等的情況。

void quick_sort_3_way(float data, int left, int right)

else if (data[j] > pivot)

swap(data[j], data[--r]);

else j++;

}swap(data[j], data[right]);

quick_sort_3_way(data, left, l);

quick_sort_3_way(data, j+1, right);}}

參考資料-極客時間專欄《資料結構與演算法之美》

快速排序之三路快排

當大量出現重複值時,我們使用三路快排,如下 arr 表示排序陣列 l 表示陣列左邊界 r 表示陣列右邊界 public static void quicksortinternal3 int arr,int l,int r else if arr i v else 交換l與lt元素,可以確定基準值的位...

三路快排板子

還是覺得別人的快排寫得太醜了 雙路快排 void qsort2 int l,int r 隨機取值 int index rand r l 1 l swap nums l nums index int key nums l int i l,j r while i j nums i nums j whil...

Java快速排序以及其優化(雙路快排 三路快排)

快速排序是屬於交換排序的基本思想。選擇乙個基準值val,把比val小的放在前面,比val大的放在後面,最後把val放在兩個區域中間,val就到了最終的位置。很明顯快排是乙個原地排序,也是乙個不穩定排序。空間複雜度 1.可以是為新陣列開闢額外空間o n 2.當然也可以在原陣列內交換得來o 1 時間複雜...