未完成的快排

快速排序


快排的核心就是分治递归技术,简而言之就是不断的把大问题划分为小问题,利用小问题的解可以得出大问题的解,小问题再继续划分小小问题…..直到可以直接求出或较为简单的求出小小小…问题的解,即此时找到了递归出口。把这个小小小…问题的解记录下来并提交回上级,那么上级小小小..问题的解也解决了,然后就不断地返回,直到最大级别的大问题,此时我们的问题就解决了。然后明白这个思想了,就来看看这种思想在快速排序中的运用,首先我们得到了一串数字a1,a2,a3…..a10。我们首先(习惯性)把a1作为关键数据然后先把它取出来(随便定义个变量,把a1赋予它):x = a1.这时候再在a1与结尾处分别设置一个浮动小标记。i,j(i=1,j=n)。此时就开始比较了(先从后面比较),1.a[j]比x小(之所以要比较小,因为我想让排好后的序列按从大到小排列)的话,就把它赋予a[i](可能有的朋友不明白为什么是直接赋予,疑惑a[i]处的值不就直接被抹盖了么,其实不然,i = 1时,x已记录了它的值,此时a[i]可看为无用空间,即使被掩盖也无所谓,如果被掩盖的话a[i]与a[j]处的值相同,a[j]就变为无用空间了,等待着找到的下个值来赋予它),然后j–,否则就直接执行j–(即a【j】小于a【i】) .好了,我们第一次的选择判断完了,此时在a[i]左边都是比a[i]小的值,在a[i]右边都是比a[i]大的值,此时或许有朋友问,可是此时左右都是无序数列啊,对,没错不过不急,我们继续重复此以上步骤,将左边,右边分别进行以上步骤,不断砍为两部分最后砍的一个序列只剩三个数,一次排序后就有序了(即有序后无法再递归下去)那么就可以向上返回了,(好似向上级报告,我们这一队列有序了),很多段都有序后向上级报告我们有序了,那么这许多段就组成了有序数列。此时,该数列就有序了

    #include <stdio.h> 
    int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 
    void quicksort(int left,int right) 
    { 
        int i,j,t,temp; 
        if(left>right) 
           return; 

        temp=a[left]; //temp中存的就是基准数 
        i=left; 
        j=right; 
        while(i!=j) 
        { 
                       //顺序很重要,要先从右边开始找 
                       while(a[j]>=temp && i<j) 
                                j--; 
                       //再找右边的 
                       while(a[i]<=temp && i<j) 
                                i++; 
                       //交换两个数在数组中的位置 
                       if(i<j) 
                       { 
                                t=a[i]; 
                                a[i]=a[j]; 
                                a[j]=t; 
                       } 
        } 
        //最终将基准数归位 
        a[left]=a[i]; 
        a[i]=temp; 

        quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程 
        quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程 
    } 
    int main() 
    { 
        int i,j,t; 
        //读入数据 
        scanf("%d",&n); 
        for(i=1;i<=n;i++) 
                       scanf("%d",&a[i]); 
        quicksort(1,n); //快速排序调用 

        //输出排序后的结果 
        for(i=1;i<=n;i++) 
            printf("%d ",a[i]);
        return 0; 
    } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值