【问题标题】:Arguments to Partition function for Quicksort快速排序的分区函数参数
【发布时间】:2015-05-29 13:07:57
【问题描述】:

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

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

其中 A 是数组,n 是数组的大小,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() 的输入。对于第一个参数,我选择了 &A[low_int],因为我没有使用“left”作为我的输入之一,因此我试图创建一个指针来基本上稍后启动我的数组。第三个参数 if for pivot,我一直试图在该范围内选择一个元素,但是这个和参数 1 都导致我的代码返回未排序的数组或无限运行。

我可以在这里获得一些帮助,了解我做错了什么以及如何解决它吗?

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

【问题讨论】:

    标签: c arrays quicksort partitioning


    【解决方案1】:

    考虑如果low_int 是 1000 和 high_int 是 2000 并且数组在 2000 结束时会发生什么。现在你给它数组 B = &amp;A[1000] 和值 2001。2001 的值使它访问元素 @ 987654324@。它正在越界访问数组。

    您不应该在第二个参数中使用high_int - low_int + 1 之类的东西吗?注意:我还没有验证您的代码在参数high_int - low_int + 1 中没有错误,但无论如何,在我看来,您应该从high_int 中减去low_int

    另一种选择是给它Alow_inthigh_int

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 2015-10-28
      • 2017-03-05
      • 2018-09-13
      • 2021-06-11
      • 2017-08-15
      相关资源
      最近更新 更多