- 在二路快排中,将相等的元素均分到了左右两个区间。
- 在三路快排中,将所有相等的元素一次性全部放置到位,处理完,只需在<v的区间和>v的区间上继续进行快速排序即可。

/**
* 三路快排
* @param arr
*/
public static void quickSort3(int[] arr) {
quickSortInternal3(arr, 0, arr.length - 1);
}
/**
*
* @param arr
* @param l
* @param r
*/
private static void quickSortInternal3(int[] arr, int l, int r) {
if(r - l <= 15) {
insertBase(arr, l, r);
return;
}
int randomIndex = random.nextInt(l, r);
swap(arr, l, randomIndex);
int v = arr[l];
//arr[l + 1...lt] < v
int lt = l;
//arr[gt...r] > v
int gt = r + 1;
//arr[lt + 1...i) == v
int i = l + 1;
//终止条件 i == gt
while(i < gt) {
if(arr[i] < v) {
//arr[l + 1...lt] < v
swap(arr, lt + 1, i);
lt++;
i++;
}else if(arr[i] > v) {
//arr[gt...r] > v
swap(arr, gt - 1, i);
gt--;
//此时i无需++,因为gt - 1这个元素还没有处理,刚好换到了i这个位置继续处理
}else{
//arr[lt + 1...i) == v
i++;
}
}
swap(arr, l, lt);
//arr[l...lt - 1] < v
quickSortInternal3(arr, l, lt - 1);
//arr[gt...r] > v
quickSortInternal3(arr, gt, r);
}