快速排序

本文深入介绍了快速排序这一高效排序算法的实现原理与过程。通过分治策略,将数组分为两个子数组并递归排序,最终实现整个数组的有序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值