【问题标题】:My Quicksort fails when sorting pre-sorted items, how to improve?我的快速排序在对预先排序的项目进行排序时失败,如何改进?
【发布时间】:2020-05-15 22:18:19
【问题描述】:

这是一个标准的递归快速排序实现,它成功地为未排序的项目排序较大的列表,但不能为“预排序”项目排序。我知道这需要更长的时间,但不会完全失败。有什么可能的改进吗?

void quickSort(int *array, size_t count) {
    int pivot = array[count - 1];
    int max_index = 0;
    for (size_t i = 0; i < count - 1; ++i) 
    {
        if (array[i] < pivot) {
            swap(array[i], array[max_index]);
            ++max_index;
        }
    }
    swap(array[max_index], array[count - 1]);

    if (max_index > 1)
        quickSort(array, max_index);
    if (count - max_index - 1 > 1)
        quickSort(array + max_index + 1, count - max_index - 1);
}

【问题讨论】:

  • “失败”是什么意思?
  • 您能否展示一个输入失败的示例以及输出?
  • 现在执行您的 9999 个项目的快速排序。您的快速排序耗时 0.005833 秒。现在执行 9999 个预排序项目的快速排序。 (进程 16128)以代码 -1073741571 退出。 ^^^^这是我收到的输出,当我放入9,999个项目进行排序时,它是一个测试程序。它不输出指示完全出错的时间,可能是堆栈溢出。
  • 你使用的是哪个swap函数?
  • 使用 库 std::swap

标签: c++ sorting quicksort implementation


【解决方案1】:

我认为您的问题是选择枢轴值。您正在使用最右边的值 (array[count-1]),这可能导致 worst-case behavior 用于已排序的序列。您创建一个大小为 1 的分区和另一个大小为 n-1 的分区。这会导致一系列 n-1 递归调用,从而导致性能不佳 O(N2) 或堆栈溢出。

您应该考虑以下替代方案:

  • 随机索引
  • 中间索引
  • 三个索引(first、middle、last)的中位数
  • 更复杂的东西,比如中位数的中位数 (ninther)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2014-10-18
    • 2011-07-10
    相关资源
    最近更新 更多