【发布时间】:2012-05-23 07:45:21
【问题描述】:
我正在尝试修改一些快速排序代码以使用随机数作为基准。
但是,在测试程序时,它没有正确排序。我不确定为什么会这样。
int random (int num) {
int random = rand() % (num - 1);
return random;
}
int* partition (int* first, int* last);
void quickSort(int* first, int* last) {
if (last - first <= 1) return;
int* pivot = partition(first, last);
quickSort(first, pivot);
quickSort(pivot + 1, last);
}
int* partition (int* first, int* last) {
//--int pivot = *(last - 1);
int* pos = (first + random(last - first));
int pivot = *pos;
int* i = first;
int* j = last - 1;
for (;;) {
while (*i < pivot && i < last) i++;
while (*j >= pivot && j > first) j--;
if (i >= j) break;
swap (*i, *j);
}
swap (*pos, *i);
return i;
}
【问题讨论】:
-
快速排序很棒,因为您实际上可以单独测试各个部分——您可以尝试测试分区函数以查看它是否有效,然后单独测试递归快速排序。 (另请注意,如果
num = 1,您对random的定义可能会崩溃。) -
你是什么意思增加呢?如果超出范围,我无法增加它。
-
最后一个
swap (*pos, *i)看起来很可疑。我认为它应该将枢轴值移动到其最终目的地,但在分区循环之后,*pos处的值可能不再是枢轴了。 -
您可以接受您提出的每个问题的答案。它似乎被标记为可供未来读者接受,表明该问题已经有一个可接受的答案。您已经提出了几个问题,但没有接受任何问题,这可能会让人们无法回答您的问题。如果您没有接受答案,因为您认为其中任何一个都不合适,那么您可以在 cmets 中指出答案。