快速排序

快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立地排序。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;快速排序则是当两个数组都有序时,整个数组也自然就有序了。


 
 
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);
}
private static int partition(double[] A, int lo, int hi){
int pivot = lo;
int i = lo;
int j = hi+ 1;
for( ; ; ){
//这里的边界条件是i < hi, 如果当i == hi时
//在进行下次循环的时候访问的A[hi+1]就会越界
while(compareTo(A[++i], A[pivot]) == - 1 && i < hi){}
while(compareTo(A[pivot], A[--j]) == - 1 && j > lo){}
//这里的边界条件是相同的道理,如果 i == j == hi 时候未跳出
//在for循环的第一次while的A[hi+1]就会越界
if(i >= j){
break;
}
exchange(A, i, j);
}
exchange(A, pivot, j);
//pivot记得放在正确的位置
//A[lo, j-1] <= A[j] <= A[j+1, hi] 成立
return j;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值