java 實現 常見排序演算法(三)快速排序
大家好,我是烤鴨:
今天分享一下基礎排序演算法之快速排序。快速排序是內部排序(基於比較排序)中最好的比較演算法。
1. 快速排序:
原理:在要排的數(比如陣列A)中選擇一箇中心值key(比如A[0]),通過一趟排序將陣列A分成兩部分,其中以key為中心,key右邊都比key大,key左邊的都key小,然後對這兩部分分別重複這個過程,直到整個有序。
整個快排的過程就簡化為了一趟排序的過程,然後遞迴呼叫就行了。
思路:
1,定義i=0,j=A.lenght-1,i為第一個數的下標,j為最後一個數下標
2,從陣列的最後一個數Aj從右往左找,找到第一小於key的數,記為Aj;
3,從陣列的第一個數Ai 從左往右找,找到第一個大於key的數,記為Ai;
4,交換Ai 和Aj
5,重複這個過程,直到 i=j
6,調整key的位置,把A[i] 和key交換
例如 6 9 8 5 4 7(i=0,j=0)
first time: 4 9 8 5 6 7 從左向右,取>=6的(第一個為6),從右向左,取比6小的(第一個為4),交換位置(i=0,j=1)
second time: 4 5 8 9 6 7 比6大的第二個元素9,比6小的第二個元素5,交換位置(i=1,j=2)
third time: 4 5 8 9 6 7 再繼續i > j了,遞迴原方法,45基準變成4,8967基準變成8(i=2,j=1)
forth time: 4 5 7 9 6 8 同上,8和7交換(i=2,j=5)
fifth time: 4 5 7 6 9 8 同上,9和6交換(i=3,j=4)
再同上 , 7和6交換。9和8交換。
程式碼實現:
public void quickSort(int[] numbers, int start, int end) { if (start < end) { int base = numbers[start]; // 選定的基準值(第一個數值作為基準值) int temp; // 記錄臨時中間值 int i = start, j = end; do { while ((numbers[i] < base) && (i < end)) { i++; } while ((numbers[j] > base) && (j > start)) { j--; } if (i <= j) { temp = numbers[i]; numbers[i] = numbers[j]; numbers[j] = temp; i++; j--; } } while (i <= j); if (start < j) { quickSort(numbers, start, j); } if (end > i) { quickSort(numbers, i, end); } } }
耗時對比:
10W 條隨機 資料 執行如圖:
分別對比了氣泡排序,直插排序,希爾排序和快速排序。差距很明顯。
50W 條隨機 資料 執行如圖:
分別對比了氣泡排序,直插排序,希爾排序和快速排序。差距很明顯。
100W 條隨機 資料 執行如圖:
分別對比了氣泡排序,直插排序,希爾排序和快速排序。差距很明顯。
總結:
快速排序(Quicksort)是對氣泡排序的一種改進。
最壞時間複雜度和插入排序相同:O(n^2)。
氣泡排序總的平均時間複雜度為:O(nlog2n) 。
各種排序方法比較:
更多排序演算法:
氣泡排序 : https://blog.csdn.net/Angry_Mills/article/details/81057900
插入排序 : https://blog.csdn.net/Angry_Mills/article/details/81208700