未完成的快排

来源:互联网 发布:java action类 编辑:程序博客网 时间:2024/04/28 22:09

快速排序


快排的核心就是分治递归技术,简而言之就是不断的把大问题划分为小问题,利用小问题的解可以得出大问题的解,小问题再继续划分小小问题…..直到可以直接求出或较为简单的求出小小小…问题的解,即此时找到了递归出口。把这个小小小…问题的解记录下来并提交回上级,那么上级小小小..问题的解也解决了,然后就不断地返回,直到最大级别的大问题,此时我们的问题就解决了。然后明白这个思想了,就来看看这种思想在快速排序中的运用,首先我们得到了一串数字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