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);
}
}
私はこのように理解しています。いったん別の再帰呼び出しが行われないと、元の**呼び出し関数に実行を返します。そしてそれは元の呼び出し元にあるので、最初のquickSort再帰呼び出しを通過して2番目の呼び出しに移動します。あれは正しいですか? – John
@AllenEricssonはい。呼び出しが再帰的に起こることは、2つの 'printf'文と同じように動作するので、実際には問題になりません。最初の呼び出しが終了すると、2番目の呼び出しが呼び出されます。これはすべての深度で発生しますが、反復の1つには関係ありません。 – Sylwester
他のスタックフレームはどうなりますか? 5つの再帰呼び出しがあり、5番目の呼び出しが低> =高であるとします。他の4つのフレームはどうなりますか? – John