Quicksort分区

时间:2015-08-05 21:27:42

标签: c algorithm quicksort

我想了解并实施quicksort: 所以我一直在读这个:

http://www.geeksforgeeks.org/iterative-quick-sort/

我不明白分区代码。

/* A typical recursive implementation of quick sort */

/* This function takes last element as pivot, places the pivot element at its
   correct position in sorted array, and places all smaller (smaller than pivot)
   to left of pivot and all greater elements to right of pivot */
int partition (int arr[], int l, int h)
{
    int x = arr[h];
    int i = (l - 1);

    for (int j = l; j <= h- 1; j++)
    {
        if (arr[j] <= x)
        {
            i++;
            swap (&arr[i], &arr[j]);
        }
    }
    swap (&arr[i + 1], &arr[h]);
    return (i + 1);
}

/* A[] --> Array to be sorted, l  --> Starting index, h  --> Ending index */
void quickSort(int A[], int l, int h)
{
    if (l < h)
    {        
        int p = partition(A, l, h); /* Partitioning index */
        quickSort(A, l, p - 1);  
        quickSort(A, p + 1, h);
    }
}

所以我想说我有这个数组,[3,8,7] 所以它将最后一个元素作为一个支点。那是7。

分区函数的第一步是(对于l = 0和h = 2):

x = 7
i = -1

然后在循环中,arr[j] <= x将为真。因为3 <= 7。 那么它会将i增加1,然后将3与3交换?它没有意义。那只会返回相同的数组

1 个答案:

答案 0 :(得分:4)

让我们看看会发生什么:

x = 7
j = 0:

  3 <= 7: swap(arr[0], arr[0]) => nothing happens

j = 1:

  8 <= 7 is false => nothing happens

现在,请注意i == 0,我们有一行:

swap (&arr[i + 1], &arr[h]);

这意味着我们将arr[1]arr[2]交换,您的数组将为3 7 8。在分析中没有考虑这一点。

这是正确的,并且枢轴的返回位置i + 1 == 1也是正确的。

您可以在每个感兴趣的行之后添加print语句,也可以使用调试器逐步完成,以便更好地了解正在发生的事情。在纸上这样做可能会导致这样的错误,你不小心跳过了步骤,特别是在学习某些东西时(说实话,我花了几分钟才意识到你错过了这一行)。