1. 程式人生 > 其它 >快速排序遞迴解析

快速排序遞迴解析

#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

接下來進行遞迴

(left=0,i=2)

quicksort(0,1);

quicksort(0,0);

此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=0right=6);

quicksort(1,6)

這時執行這個遞迴時會遇到第一個遞迴quicksort(left,i-1);(此時left=1i=1)

quicksort(1,1)

此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=1right=6);

quicksort(2,6)

這時執行這個遞迴時會遇到第一個遞迴quicksort(left,i-1);(此時left=2i=2)

quicksort(2,2)

此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=2right=6);

quicksort(3,6)

這時執行這個遞迴時會遇到第一個遞迴quicksort(left,i-1);(此時left=3i=5)

quicksort(3,4)

quicksort(3,3)

此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=3right=6);

quicksort(3,6)

這時執行這個遞迴時會遇到第一個遞迴quicksort(left,i-1);(此時left=4i=4)

quicksort(4,4) 此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=4right=6);

quicksort(5,6)

quicksort(5,5)

此時遇到出口,進入第二個遞迴quicksort(i+1,right);(此時i=5right=6);

即為quicksort(6,6)此時第二個遞迴結束,由於遞迴一直保留著之前的呼叫點,此時一層一層返回釋放掉呼叫點!然後整個函式呼叫結束!

總結:第二個遞迴的作用就是控制第一個遞迴,能夠從左到右每一個數都當作基準點執行一次排序!