三路快速排序算法基本原理
-不需要多次操作重复元素
-适用于重复元素较多的情况
-将序列分为三个部分
若e=v,把e并入=v的部分
若e小于v,把e并入小于v的部分
若e大于v,把e并入大于v的部分
排序完成后的最终形态
具体实现
// 三路快速排序算法,对解决重复性高的元素集合效率高,不需要大量操作重复元素
public static <T extends Comparable<? super T>> void quickSort3(T[] arr, int n) {
sonOfQuickSort3(arr, 0, n - 1);
}
// 对arr[l...r]部分进行三路快速排序
private static <T extends Comparable<? super T>> void sonOfQuickSort3(T[] arr, int l, int r) {
// 当n小到一定程度时,插入排序比归并排序快
if (r - l <= 15) {
// 当分块中元素为15+1时,换成插入排序
SelectionSort.insertionSort(arr, r, l);
return;
}
// partition
swap(arr[l], arr[(int) (Math.random() * (r - l + 1)) + l]);
T 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;
while (i < gt) {
if (arr[i].compareTo(v) < 0) {
swap(arr[i], arr[lt + 1]);
lt++;
i++;
} else if (arr[i].compareTo(v) > 0) {
swap(arr[i], arr[gt - 1]);
gt--;
} else {
i++;
}
}
swap(arr[l], arr[lt]);
sonOfQuickSort3(arr, l, lt - 1);
sonOfQuickSort3(arr, gt, r);
}
双路快速排序算法消耗时间164ms
三路快速排序算法消耗时间64ms