快速排序----个人学习总结(C++)

代码呈现:

void quick_sort1(int q[],int l,int r){
    if(l>=r)
        return;
    int x=q[l+r>>1], i=l-1, j=r+1;
    while(i<j){
        do i++; while(q[i]<x);
        do j--; while(q[j]>x);
        if(i < j) swap(q[i],q[j]);
    }
    quick_sort1(q,l,j);
    quick_sort1(q,j+1,r);
}

思想:

分治+递归:1.确定一个分界点x,可以取q[l] ,q[r] ,q[(l+r)/2],随机值.

(取决于后面按i还是j划分,如果是按i划分就不能取q[l],如果是按j划分就不能取q[r],所以还是取随机值最好。具体原因是因为边界的细节问题,可以举例试试,有可能会陷入无限循环,比如最大数在右边按j划分取q[r])

2.用指针i,j调整数组元素位置,使得 q[l] 到 q[j]的数组范围中的数都小于等于x,而q[i]到q[r]的数组范围的数都大于等于x。

(调整方法大致为,先定义i=l-1,j=r+1,之所以不直接定义为l和r是因为后面我用的是do-while,会先进行一次自加和自减,然后i和j相向而行直到它们都遇见一个不满足区间要求的数后停下来,进入if语句中交换这两个数,以此类推直到 i>=j,一般有奇数个数的数组最后 i=j,而偶数个数数组最后 i>j。因为偶数数组这种情况所以会出现按 j 划分还是按 i 划分,可以模拟一下这个过程会更清晰)

3.再次递归处理左右两段数直到不能再分,最后得到的数组就是有序的

不清楚的地方一般模拟一下就十分明朗了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值