2
什么信号表示程序说:“好,第一次递归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
那么其他堆栈帧会发生什么?假设有五个递归调用,第五个调用是当low> = high时。其他四帧会发生什么? – John