三向切分的快速排序

优点:三向切分的快速排序比归并排序、标准快速排序和其他排序方法在包括重复元素很多的实际应用中更快。


 
 
public static void quickThreeWaySort(double[] A){
quickThreeWay(A, 0, A.length- 1);
}
private static void quickThreeWay(double[] A, int lo, int hi){
if(lo >= hi){
//同上
return;
}
double pivot = A[lo];
int lt = lo; //小于pivot的指针
int i = lo + 1; //等于pivot的指针
int gt = hi; //大于pivot的指针
while(i <= gt){
int cmp = compareTo(A[i], pivot);
if(cmp < 0){
exchange(A, i++, lt++);
}
else if(cmp > 0){
exchange(A, i, gt--);
}
else{
i++;
}
}
//跳出while循环后
//A[lo, lt-1] < pivot=A[lt, gt] < A[gt+1, hi]成立
quickThreeWay(A, lo, lt- 1);
quickThreeWay(A, gt+ 1, hi);
}
public static void quickSort(double[] A){
quickSortAPI(A, 0, A.length- 1);
}
private static void quickSortAPI(double[] A, int lo, int hi){
if(lo >= hi){
//这里可以使用插入排序,降低递归带来的效率下降
//判断条件应该是 lo + x >= hi
return;
}
int pivot = partition(A, lo, hi);
quickSortAPI(A, lo, pivot- 1);
quickSortAPI(A, pivot+ 1, hi);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值