一、原理
1. 從待排序區間選擇一個數,作爲基準值(index);
2. Partition: 遍歷整個待排序區間,將比基準值小的(可以包含相等的)放到基準值的左邊,將比基準值大的(可以包含相等的)放到基準值的右邊;
3. 採用分治思想,對左右兩個小區間按照同樣的方式處理,直到小區間的長度 == 1,代表已經有序,或者小區間的長度 == 0,代表沒有數據。
二、圖解
1.以{1, 3, 6, 5, 0, 2}爲例,將較小的數換在左邊,反之在右邊。
將最右邊的數作爲基準值,right先從右邊向左找第一個比基準值2小的數,找到爲0;left再從左邊向右找第一個比基準值大的數,找到爲3,交換這兩個數。
2.
在1.的基礎上,right先走,從右往左找第一個比基準值2小的數,我們發現,此時right和left相遇了,將相遇的值與基準值2比較,相遇的值比基準值大,所以我們交換兩個數。
3.
現在,第一趟比較已經結束,數字2相當於已經歸位了,所以我們以2爲分界線,分別比較2左邊的數和2右邊的數,比較方法和上面的一樣。最後我們會得到一組有序的數。
三、代碼實現
public static void quickSort(int[] array) { //快速排序
quickSortHelper(array, 0, array.length - 1);
}
private static void quickSortHelper(int[] array, int left, int right) {
if (left >= right) {
return;
}
int index = partition(array, left, right);
quickSortHelper(array,left, index - 1);
quickSortHelper(array, index + 1,right);
}
private static int partition(int[] array, int left, int right) {
int index = right; //基準值
while (left < right) {
while (left < right && array[left] <= array[index]) {
left++;
}
while (left < right && array[right] >= array[index]) {
right--;
}
swap(array, left, right);
}
swap(array, left, index);
return left;
}
public static void swap (int[] array, int x, int y) {
int tmp = array[x];
array[x] = array[y];
array[y] = tmp;
}