三路快排在双路快排的基础之上,把与标定点元素等值的元素排在了数组的中间位置。
比较从第 1 版的快速排序,到两个优化,再到指针对撞的快速排序,在到三路快速排序,它们在思路上的变化。
三路快速排序的思路展示:
代码实现:
/**
* 三路快速排序
* Created by liwei on 17/6/8.
*/
public class QuickSortTest03 {
@Test
public void test03() {
int[] arr = ArrayUtil.generateRandomArray(1000000,1,1000000000);
quickSort3Ways(arr, 0, arr.length - 1);
System.out.println(ArrayUtil.judgeArraySorted(arr));
}
/**
* @param arr
* @param left
* @param right
*/
private void quickSort3Ways(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int v = arr[left];
int lt = left;
int gt = right + 1;
int i = left + 1;
while (i < gt) {
if (arr[i] < v) {
swap(arr, lt + 1, i);
i++;
lt++;
} else if (arr[i] > v) {
swap(arr, gt - 1, i);
gt--;
} else { // arr[i]==v
i++;
}
}
swap(arr, left, lt);
quickSort3Ways(arr, left, lt - 1);
quickSort3Ways(arr, gt, right);
}
private void swap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}