程序说的是什么,"确定第一次递归的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);
}
}
答案 0 :(得分:0)
您的实际问题源于Recursion Stack。
让我们首先理解Recursion,它基本上构成了一种方法,它一直在越来越小的情况下调用自己,并且每次都重复相同的非递归过程,直到达到基本情况为止。
在QuickSort的情况下,递归的基本情况是大小为零或一的列表,从不需要对其进行排序。如果不是这种情况,则不打算对数组进行排序。这就是为什么我们在较小尺寸的阵列上再次调用QuickSort方法两次。
我们递归包含A[0] to A[i - 2]
中所有元素的数组,以及包含元素A[i] to A[A.length - 1]
的数组的一侧。
为什么我们遗漏A[i - 1]
?简单 - 它已经在正确的位置。