介紹:
快速排序(Quicksort)是對冒泡排序的一種改進。
它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
解析:
有數組A,取一個基準值,通過一輪排序的算法後,數組被基準值拆分爲兩部分,前部分小於等於基準值,後部分大於基準值。將得到前部分數組和後部分數組繼續遞歸調用排序算法。直到排序完成。
僞代碼:
排序(A, p, r) {
if (p < r) {
q = 排序子方法(A, p, r)
排序(A, p, q-1)
排序(A, q+1, r)
}
}
排序子方法(A, p, r) {
x = A[r]
i = p - 1
for (j = p to r -1 ) {
if (A[j] <= x) {
i = i + 1
A[i] 和 A[j] 交換
}
}
A[i + 1] 和 A[r] 交換
return i + 1
}
僞代碼分析:
調用方法: 排序(數組A,0, 數組A.length - 1)
排序方法非常明確,p,r各表示數組的前後兩端的下標。q表示拆分數組的點,根據這個點將數組拆分成兩個,左邊小於等於基準點,右邊大於基準點。
我們重點分析排序子方法(A, p, r) 這個方法實現了排序,並返回了拆分點。
首先,我們始終取數組最後一個元素爲基準點,x。
遍歷數組A的除x之外的所有元素,與x進行比較。如果元素小於或等於x,i加1, 互換i和j的元素。
這裏爲什麼是和i互換元素呢:
7, 9, 11, 3, 8
首先i初始被定義爲-1,
j = 0 ; 7 <= 8 ; i = 0 ; 0和0互換,相當於沒換
j = 1 ; 9 > 8 ; 不走if裏面的內容,i 還是等於 0
j = 2 ; 11 > 8; 不走if裏面的內容,i 還是等於 0
j = 3 ; 3 <=8 ; i = 1 ;3和1互換 數組爲:7, 3, 11, 9, 8
最後,我們在循環外,還進行了一次互換,i + 1 和 r 互換,這個互換是因爲,我們將r最爲基準點來比較,r的位置一直是沒有變化的,我們將小於r的放在左邊,大於r的放在右邊,最後,我們需要把r放在合適的位置,才能達到這個效果:
i = 1 ; r = 4
根據上面數組的互換,我們已經保證了 0 ~ i 的數據是比8小的,所以,我們通過 i+1和r互換,得到想要的效果。
之後就是遞歸調用,直到排序完成。
Java代碼:
public static void main(String[] args) {
int[] sortInt = {7, 9, 11, 3, 4, 5, 10, 8};
quickSort(sortInt, 0, sortInt.length - 1);
}
public static void quickSort(int[] array, int start, int end) {
if (start < end) {
int q = partition(array, start, end);
quickSort(array, start, q - 1);
quickSort(array, q + 1, end);
}
printArray(array);
}
private static int partition(int[] array, int start, int end) {
int x = array[end];
int i = start - 1;
for (int j = start; j < end; j ++) {
if (array[j] <= x) {
i = i + 1;
int temp = array[i]; array[i] = array[j]; array[j] = temp;
}
}
int temp = array[i + 1]; array[i + 1] = array[end]; array[end] = temp;
return i + 1;
}
[1] 僞代碼摘自 《算法導論》 機械工業出版社
[2] 介紹摘自 百度百科對於快速排序的定義 https://baike.baidu.com/item/快速排序算法/369842?fromtitle=快速排序&fromid=2084344&fr=aladdin