2017-02-11 16 views
2

「最初の再帰的なquickSort呼び出しが完了しました; 2番目の再帰的な呼び出しに進む」と言う信号は何ですか?最初の再帰的なクイックソート呼び出しから再帰がどのように壊れますか?

int partition (int arr[], int low, int high) 
{ 
    int pivot = arr[high]; // pivot 
    int i = (low - 1); // Index of smaller element 

    for (int j = low; j <= high- 1; j++) 
    { 
     if (arr[j] <= pivot) 
     { 
      i++; // increment index of smaller element 
      swap(&arr[i], &arr[j]); 
     } 
    } 
    swap(&arr[i + 1], &arr[high]); 
    return (i + 1); 
} 

void quickSort(int arr[], int low, int high) 
{ 
    if (low < high) 
    { 
     int pi = partition(arr, low, high); 
     quickSort(arr, low, pi - 1); 
     quickSort(arr, pi + 1, high); 
    } 
} 

答えて

0

実際の質問はRecursion Stackに由来しています。

最初に理解してみましょう。これは、基本的にはますます小規模なケースで自分自身を呼び出すことを保つメソッドであり、ベースケースに達するまで毎回同じ非再帰的プロシージャを繰り返します。

QuickSortの場合、再帰の基本ケースはサイズ0または1のリストであり、決してソートする必要はありません。そうでない場合は、配列はソートされません。そのため、小さいサイズの配列に対してQuickSortメソッドを2回呼びます。

A[0] to A[i - 2]のすべての要素と、A[i] to A[A.length - 1]という要素を含む配列の辺を含む配列の側に繰り返し表示されます。

A[i - 1]はなぜ除外しますか?シンプル - すでに正しい場所にあります。

+0

私はこのように理解しています。いったん別の再帰呼び出しが行われないと、元の**呼び出し関数に実行を返します。そしてそれは元の呼び出し元にあるので、最初のquickSort再帰呼び出しを通過して2番目の呼び出しに移動します。あれは正しいですか? – John

+0

@AllenEricssonはい。呼び出しが再帰的に起こることは、2つの 'printf'文と同じように動作するので、実際には問題になりません。最初の呼び出しが終了すると、2番目の呼び出しが呼び出されます。これはすべての深度で発生しますが、反復の1つには関係ありません。 – Sylwester

+0

他のスタックフレームはどうなりますか? 5つの再帰呼び出しがあり、5番目の呼び出しが低> =高であるとします。他の4つのフレームはどうなりますか? – John

関連する問題