幾乎所有的程式語言都會提供排序函式,比如 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 時間複雜...