曾格的github

考研-快速排序

天勤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("\n");
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 ,而做题时不涉及到代码的情况下用手工快排就好。

 

posted @ 2018-10-14 13:11  曾格  阅读(570)  评论(0编辑  收藏  举报
Live2D