1. 快速排序

原题链接

y总:注意本题数据已加强,划分中点取左端点或右端点时会超时,改成取中点或者随机值即可。

  • 啊哈算法

左端点定为temp,右边先开始走,当左右哨兵相遇时,保证在i左边的数都<=temp,右边的数都>=temp,temp归位,因为是i==j取到的值,所以l>r时返回

20882701-0d0dbb33b5748be4.png

//最开始接触的快排版本,不用考虑边界递归问题,很简单好懂,写法也不容易混淆,但过不了这题

int a[MAX],n;
void quick_sort(int l,int r)
{
    if(l>r)
        return ;
    int i=l,j=r,temp=a[l];
    while(i!=j)
    {
        while(a[j]>=temp&&i<j)
        j--;
        while(a[i]<=temp&&i<j)
        i++;
        if(i<j)
            swap(a[i],a[j]);
    }
    a[l]=a[i];
    a[i]=temp;
    quick_sort(l,i-1);
    quick_sort(i+1,r);
}
  • 学习进阶

先把左右两指针往中间移动,然后再判断
递归情况[l,j][j+1,r]
x取中间值a[(l+r)>>1]

void quick_sort(int l,int r)
{
    if(l>=r)
        return ;
    int i=l-1,j=r+1,x=a[(l+r)>>1];
    while(i<j)
    {
    do i++;while(a[i]<x);
    do j--;while(a[j]>x);
    if(i<j)swap(a[i],a[j]);
    }
    quick_sort(l,j);
    quick_sort(j+1,r);
}
20882701-eff10348a1053fc6.png
这种情况,[l,j][j+1,r]或[l,j-1][j,r]都可取
20882701-0c40db555add65d7.png
只有[l,j][j+1,r]可取
  • 递归j

一定不能取右边界,否则会边界死循环
x=a[l]或x=a[(l+r)/2],对应[l,j],[j+1,r]

  • 递归i

一定不能取到左边界,否则边界会死循环

x=a[r]或x=a[(l+r)/2+1],对应[l,i-1],[i,r]

void quick_sort(int l,int r)
{
    if(l>=r)
        return ;
    int i=l-1,j=r+1,x=a[(l+r)>>1];//x=a[(l+r+1)>>1]
    while(i<j)
    {
    do i++;while(a[i]<x);
    do j--;while(a[j]>x);
    if(i<j)swap(a[i],a[j]);
    }
    quick_sort(l,j);//  quick_sort(l,i-1);
    quick_sort(j+1,r);//quick_sort(i,r);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值