算法思想:
樹立一個基準數(以此數作為比較的標桿),分別從數組兩邊進行探測查找,右邊的探測結束條件為找到一個比基準數小的數,左邊的探測結束條件為找到一個基準數大的數,當左右兩邊的探測都結束后,交換這兩個數;重復以上過程,直到兩邊探測的索引相遇(一致)。最后將基準數與索引相遇的位置上的數交換。廢話不多說,上圖:
假設我們對{6,1,2,7,9,3,4,5,10,8}這10個數進行排序。
注:i,j分別為左右兩端的探測,姑且稱它們為哨兵,首先哨兵j開始出動。因為此處設置的基準數是最左邊的數,所以需要讓哨兵j先出動,否則會出現遞歸無法退出的情況。哨兵j一步一步地向左挪動(即j--),直到找到一個小于6的數停下來,接下來哨兵i再一步一步向右挪動(即i++),直到找到一個大于6的數停下來。最后哨兵j停在了數字5面前,哨兵i停在了數字7面前。
交換哨兵i和哨兵j所指向元素的值,交換后序列如下:
6 1 2 5 9 3 4 7 10 8
到此,第一次交換結束。接下來哨兵繼續向左挪動。它發現了4之后停了下來。哨兵i也繼續向右挪動,它發現9之后停了下來。此時再次進行交換,再次進行交換,交換之后的序列如下:
6 1 2 5 4 3 9 7 10 8
第二次交換結束,探測繼續。哨兵j繼續向左挪動,它發現了3之后又停了下來。此時哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。說明此時探測結束。我們將基準數6和3進行交換。交換之后的序列如下。
3 1 2 5 4 6 9 7 10 8
到此第一輪探測真正結束,此時以6為分界點,6左邊的數都小于等于6,6右邊的數都大于等于。
此時我們已經將原來的序列以6為分界點拆分成了兩個序列,左邊序列{3,1,2,5,4},右邊序列{9,7,10,8},接下來只需要再以上述同樣的方法對這兩個序列分別進行排序即可。
快排的java實現:
public class QuickSortTest {
public void quickSort(int[] arr,int left,int right){
if(left > right)
return;
int i = left;
int j = right;
int temp = arr[left];
while(i!=j){
while(i<j && arr[j]>=temp)
j--;
while(i<j && arr[i]<=temp)
i++;
if(i<j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[left] = arr[i];
arr[i] = temp;
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}
}