zoukankan      html  css  js  c++  java
  • 考研-快速排序

    天勤2019考研数据结构

    附上代码:

     1 void QuickSort(int R[],int low,int high){
     2     int temp;
     3     int i=low; int j=high;
     4     if(low<high){         //low==high 为递归出口
     5         temp=R[low];
     6 
     7         while(i<j){    //俩次查找的首要条件
     8 
     9         while(j>i && R[j]>=temp){      //从右往左查找,这个找 j 的语句有点秒
    10             --j;
    11         }
    12         if(i<j){                    //排除是因为不满足j>i而跳出的while循环
    13                 R[i]=R[j];
    14                 ++i;
    15         }
    16 
    17         while(i<j && R[i]<temp){       //从走往右查找,没有=号
    18             ++i;
    19         }
    20         if(i<j){
    21             R[j]=R[i];
    22             --j;
    23         }
    24 
    25         }
    26         R[i]=temp;       //应该R[i]= 和R[j]= temp都一样,现在是i=j
    27         for(int u=0;u<8;++u){
    28            printf("%d ",R[u]);
    29         }
    30 
    31         printf("i=j:%d low:%d high:%d temp:%d",i,low,high,temp);printf("
    ");
    32 
    33         QuickSort(R,low,i-1);
    34         QuickSort(R,i+1,high);
    35     }
    36 }
    int main()
    {
        int r[8]={72,73,71,23,94,16,05,68};
        int a[8]={29,18,25,47,58,12,51,10};
        QuickSort(a,0,7);
    QuickSort(r,0,7);
    return 0;
    }

    先说r的排序状况:

    r每一次递归调用QuiklySort函数的结果(low<high)

    a的执行结果:

    但书上说的a数组每一次进行的数组划分是:

    第一趟:10,18,25,12,29,58,51,47

    第二趟:10,18,25,12,29,47,51,58

    第三趟:10,12,18,25,29,47,51,58   

    所以书上并不是先把左递归进行到底再进行的右递归!而是在同一层对所有的子序列进行快排!

    =》也就是说:这本书上手工快排和代码快排的流程是不一样的,但本质是一样的,都是左右俩边不断递归,直到 i>=j ,而做题时不涉及到代码的情况下用手工快排就好。

    心之所愿,永不相忘
  • 相关阅读:
    【ORA-02049】超时分布式事务处理等待锁 解决方法
    Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32
    JS身份证号码校验
    linux 下查看cpu位数 内核等参数命令(转)
    linux ps命令,查看进程cpu和内存占用率排序(转)
    JAVA图片验证码
    JAVA BigDecimal 小数点处理
    Linux命令大全
    Eclipse Java注释模板设置详解
    JSONArray的应用
  • 原文地址:https://www.cnblogs.com/zgll/p/9786058.html
Copyright © 2011-2022 走看看