《JAVA》淺談——快速排序
阿新 • • 發佈:2018-11-10
快速排序:又稱劃分交換排序(partition-exchange sort),一種排序演算法,最早由東尼·霍爾提出。在平均狀況下,排序n個專案要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n)演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。
演算法規則: 本質來說,快速排序的過程就是不斷地將無序元素集遞迴分割,一直到所有的分割槽只包含一個元素為止。
由於快速排序是一種分治演算法,我們可以用分治思想將快排分為三個步驟:
- 分:設定一個分割值,並根據它將資料分為兩部分
- 治:分別在兩部分用遞迴的方式,繼續使用快速排序法
- 合:對分割的部分排序直到完成
程式碼實現(Java版本)
public int dividerAndChange(int[] args, int start, int end) { //標準值 int pivot = args[start]; while (start < end) { // 從右向左尋找,一直找到比參照值還小的數值,進行替換 // 這裡要注意,迴圈條件必須是 當後面的數 小於 參照值的時候 // 我們才跳出這一層迴圈 while (start < end && args[end] >= pivot) end--; if (start < end) { swap(args, start, end); start++; } // 從左向右尋找,一直找到比參照值還大的陣列,進行替換 while (start < end && args[start] < pivot) start++; if (start < end) { swap(args, end, start); end--; } } args[start] = pivot; return start; } public void sort(int[] args, int start, int end) { //當分治的元素大於1個的時候,才有意義 if ( end - start > 1) { int mid = 0; mid = dividerAndChange(args, start, end); // 對左部分排序 sort(args, start, mid); // 對右部分排序 sort(args, mid + 1, end); } } private void swap(int[] args, int fromIndex, int toIndex) { args[fromIndex] = args[toIndex]; }