【问题标题】:C++ QuickSort Isn't Working Correctly [closed]C++ 快速排序无法正常工作 [关闭]
【发布时间】: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 中指出答案。

标签: c++ algorithm quicksort


【解决方案1】:

您的 first implementation 有效,但在特定数据集上表现不佳。原始工作代码中的枢轴是*(last - 1),因此最简单的解决方法是将随机元素与*(last - 1) 交换。其余的原始分区代码将保持不变。

【讨论】:

  • 是否所有对last-1的引用都需要改成随机数变量/
  • @Andrew:不,只需添加一些代码以将随机元素与(last - 1) 处的元素交换。在 int pivot = *(last - 1) 行之前执行此操作,并且不需要对原始代码进行其他更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 2016-07-06
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多