递归如何突破第一次递归快速排序调用?

时间:2017-02-11 23:47:28

标签: algorithm recursion quicksort

程序说的是什么,"确定第一次递归的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);
    }
}

1 个答案:

答案 0 :(得分:0)

您的实际问题源于Recursion Stack

让我们首先理解Recursion,它基本上构成了一种方法,它一直在越来越小的情况下调用自己,并且每次都重复相同的非递归过程,直到达到基本情况为止。

QuickSort的情况下,递归的基本情况是大小为零或一的列表,从不需要对其进行排序。如果不是这种情况,则不打算对数组进行排序。这就是为什么我们在较小尺寸的阵列上再次调用QuickSort方法两次。

我们递归包含A[0] to A[i - 2]中所有元素的数组,以及包含元素A[i] to A[A.length - 1]的数组的一侧。

为什么我们遗漏A[i - 1]?简单 - 它已经在正确的位置。