快速排序

快速排序

快速排序的基本思想是

1、先从数列中取出一个数作为基准数

2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边

3、再对左右区间重复第二步,直到各区间只有一个数

概括来说为 挖坑填数+分治法

下面举例来进行说明,主要有三个参数,i为区间的开始地址,j为区间的结束地址,X为当前的开始的值

第一步,i=0,j=9,X=21

0123456789
2132439854452346686

第二步,从j开始由,后向前找,找到比X小的第一个数a[7]=4,此时i=0,j=6,X=21
进行替换

0123456789
4324398544523216686

第三步,由前往后找,找到比X大的第一个数a[1]=32,此时i=2,j=6,X=21

0123456789
4214398544523326686

第四步,从j=6开始由,由后向前找,找到比X小的第一个数a[0]=4,此时i=2,j=0,X=21,发现j<=i,所以第一回结束

可以发现21前面的数字都比21小,后面的数字都比21大
接下来对两个子区间[0,0]和[2,9]重复上面的操作即可

下面直接给出过程,就步详细解说了

i=2,j=6,X=43

0123456789
4214398544523326686

i=4,j=6,X=43

0123456789
4213298544523436686

i=4,j=5,x=43

0123456789
4213243544523986686

i=5,j=5,x=43

0123456789
4213223434554986686

然后被分为了两个子区间[2,3]和[5,9]

….最后排序下去就是最终的答案

0123456789
4212332434554668698

总结:

1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。

2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。

3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。

4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。

 #include<stdio.h>
#include<stdlib.h>
int n;
int  a[100005];
void quicksort(int l,int r)
{
    int mark=a[l];
    int i=l,j=r;
    if(l>=r) return  ;
    while(i!=j)
    {
        while(i<j && a[j]>=mark)
        {
            j--;
        }
        if(i<j)
            a[i]=a[j];
        while(i<j && a[i]<=mark)
            i++;
        if(i<j)
        a[j]=a[i];

    }
    a[i]=mark;
    quicksort(1,i-1);
    quicksort(i+1,r);


}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    quicksort(1,n);
    for(int i=1;i<=n;i++)
    {
        printf("%d ",a[i]);
    }


}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Klaus1205

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值