Quicksort的分区函数参数

时间:2015-03-25 17:45:13

标签: c arrays quicksort partitioning

所以我一直在尝试编写一个基于堆栈的快速排序函数,它调用分区函数。 partition()的标题如下:

int partition(void **A, int n, void *pivot, int (cmp)(void *, void *));

其中A是数组,n是数组的大小,pivot是pivot(不是索引)的值。

我目前对分区的调用是:

partition(&A[low_int], high_int + 1, A[low_int+(high_int-low_int)/2], cmp)

在上面,我的低和高值是迭代快速排序中使用的经典'l'和'h',其中l从最低索引开始(和h最高)。这些值随着函数的继续而变化。

我将在下面发布我的分区功能:

int 
partition(void **A, int n, void *pivot, int (cmp)(void *, void *)) {
    int k;

    int i = 0;
    for (int j = 0; j <= n-2; j++) {
        if (cmp(A[j], pivot) <= 0) {
            i++;
            swap(A, i, j);
        }
    }
    swap(A, i+1, n-1);
    k = i + 2;
    return k; //k is the first value after the pivot in partitioned A

}

我的问题是决定调用partition()的输入。对于第一个参数,我选择&amp; A [low_int],因为我没有使用“left”作为我的输入之一,因此我试图创建一个指针,以便稍后启动我的数组。第三个参数if for pivot,我一直在尝试选择该范围内的元素,但是这个和参数1都导致我的代码返回一个未排序的数组或无限运行。

我能否在这里得到一些帮助,说明我做错了什么以及如何解决?

我试图包含所有相关代码,但如果我错过了任何重要内容或者我写的内容不清楚,或者您需要更多信息,请告诉我。谢谢

1 个答案:

答案 0 :(得分:1)

如果low_int为1000且high_int为2000并且数组结束于2000,则会发生什么。现在,您为其提供数组B = &A[1000]和值2001. 2001的值导致它可以访问元素B[2001-1] = B[2000] = A[3000]。它访问数组越界。

你不应该使用类似high_int - low_int + 1的东西作为第二个参数吗?注意:我还没有确认您的代码在参数high_int - low_int + 1中没有一个一个错误,但无论如何,在我看来,您应该从low_int中减去high_int {1}}。

另一种选择是给它Alow_inthigh_int