考研-快速排序
天勤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 ,而做题时不涉及到代码的情况下用手工快排就好。
心之所愿,永不相忘