【发布时间】: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