快速排序遞迴解析
#include <stdio.h> #include <stdlib.h> int a[101],n; void quicksort(int left,int right){ int i,j,temp,t; if(left>=right) return; i=left; j=right; temp=a[left]; 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); return; } int main(){ int i; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } getchar(); quicksort(0,n-1); for(i=0;i<n;i++){ printf("%d ",a[i]); } getchar(); return 0; }
第一次進入函式quicksort,首先是把3作為基準數,然後將陣列中所有比3小的移到左邊,具體程式碼流程:右邊開始,找到比基準數小的數停止,再從左邊開始找到比基準數大的停止,然後交換,直到左邊右邊相遇時迴圈結束,結束後把基準數和此時a[i]交換;結果如下:
箭頭是指向兩個標紅的數字
交換完後繼續移動:
現在相遇了。就退出迴圈,交換基準數,此時i=2:
接下來進行遞迴
quicksort(0,1);
quicksort(0,0);
此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=0,right=6);
quicksort(1,6)
這時執行這個遞迴時會遇到第一個遞迴quicksort(left,i-1);(此時left=1,i=1)
quicksort(1,1)
此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=1,right=6);
quicksort(2,6)
這時執行這個遞迴時會遇到第一個遞迴quicksort(left,i-1);(此時left=2,i=2)
quicksort(2,2)
此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=2,right=6);
quicksort(3,6)
這時執行這個遞迴時會遇到第一個遞迴quicksort(left,i-1);(此時left=3,i=5)
quicksort(3,4)
quicksort(3,3)
此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=3,right=6);
quicksort(3,6)
這時執行這個遞迴時會遇到第一個遞迴quicksort(left,i-1);(此時left=4,i=4)
quicksort(4,4) 此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=4,right=6);
quicksort(5,6)
quicksort(5,5)
此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=5,right=6);
即為quicksort(6,6)此時第二個遞迴結束,由於遞迴一直保留著之前的呼叫點,此時一層一層返回釋放掉呼叫點!然後整個函式呼叫結束!
總結:第二個遞迴的作用就是控制第一個遞迴,能夠從左到右每一個數都當作基準點執行一次排序!