Что сигнализирует программе сказать: «Хорошо, первый рекурсивный вызов quickSort завершен, перейдите ко второму рекурсивному вызову»?Как рекурсия выходит из первого рекурсивного быстрого вызова сортировки?
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 и ко второму. Это верно? – John
@ AllenEricsson Да. То, что вызов происходит рекурсивным, не имеет большого значения, поскольку он работает так же, как и с двумя операторами 'printf'. Когда первый вызов завершен, вызывается вторая. Это происходит во всех глубинах, но это не имеет значения для одной из итераций. – Sylwester
Так что же происходит с другими фреймами стека? Скажем, есть пять рекурсивных вызовов, а пятый вызов - при низком> = высоком. Что же происходит с остальными четырьмя кадрами? – John