实现原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iTE3pZJe-1610469861174)(C0CEA802827C4C1D86A9E54022CD6E42)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDNyb47s-1610469861177)(D4AAE62AB0224EC5940178CC8859D23A)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2W9cC6Fw-1610469861180)(EB3437737EC142FCA92B040588D27361)]
三路快速排序对于常数组 是 O(n)级别的算法
【实现】
public class QuickSortThreeWays {
private QuickSortThreeWays(){}
static int[] res;
public static <E extends Comparable<E>> void sort(E[] arr){
//优化:我们只创建一次random的对象
Random random = new Random();
sort(arr,0,arr.length-1,random);
}
public static <E extends Comparable<E>> void sort(E[] arr,int l,int r,Random random){
if(l >= r) return;
//获取 lt 和 gt 的索引位置
//初始化 lt 和 gt 和 i 的索引
int lt = l,gt = r + 1,i = l + 1;
while (i < gt) {
if(arr[i].compareTo(arr[l]) < 0) swap(arr,i++,++lt);
else if(arr[i].compareTo(arr[l]) > 0) swap(arr,i,--gt);
else i++; //arr[l] == arr[i]
}
swap(arr,l,lt);
// 对 arr[l,lt-1]进行排序
sort(arr,l,lt-1,random);
//对 arr[gt,r]进行排序
sort(arr,gt,r,random);
}
public static <E extends Comparable<E>> void swap (E[] arr,int i,int j){
E temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int n = 1000000;
SortingHelper.sortTest("MergeSort",n);
SortingHelper.sortTest("MergeSortBU",n);
SortingHelper.sortTest("QuickSort",n);
SortingHelper.sortTest("QuickSortTwoWays",n);
SortingHelper.sortTest("QuickSortThreeWays",n);
}
}
【比较结果】
MergeSort:n = 1000000:0.6808196s
MergeSortBU:n = 1000000:0.832936s
QuickSort:n = 1000000:0.5503913s
QuickSortTwoWays:n = 1000000:0.3995201s
QuickSortThreeWays:n = 1000000:0.8119723s