【问题标题】:Sorting for the heck of it -- Quicksort为它排序——快速排序
【发布时间】:2011-08-11 23:21:07
【问题描述】:

我们必须为自己的 Comparable 基类进行优化的快速排序。为了我的一生,我无法让它发挥作用。该算法看起来很简单,但是我看不到让我的代码工作。我有一个 DateTime 类,它扩展了我用来测试的 Comparable 并且排序似乎有效,但是每 20 个左右运行一个单个值不合适,并且当我对数组的块使用插入排序时超过 8 个,整个排序就乱套了。

在我的分区方法中,当我将枢轴移动到末尾并在开始和结束 - 1 处开始我的指针时,它有点工作。我想将枢轴移动到结束 - 1 因为第一个和最后一个已经排序并且从第一个 + 1 和结束 -2 开始指针,但如果我尝试这样做,一切都会崩溃,我不明白为什么。

所以我有一些现在可以工作的东西。当我不在较小的子数组上使用插入排序时,它会变得有点痉挛,这很麻烦,但最终还是会弄明白。感谢 ben j 指出从数组中掉出...这是导致插入排序问题的原因。 :)

我当前的代码如下

    Comparable** partition(Comparable** from, Comparable** to)
{
    Comparable** pivot  = from + (to - from) / 2;
    SortFirstMiddleLast(from, pivot, to - 1);
    swap(*pivot, *to);
    pivot = to;
    ++from; to -= 2;
    while (from <= to)
    {
        while (**from <= **pivot && from <= to) ++from;
        while (**to   >= **pivot && from <= to) --to;
        if (from < to)
        {
            swap(*from, *to);
            ++from; --to;
        }
    }
    swap(*from, *pivot);
    return from;
}

【问题讨论】:

  • 顺便说一下,&lt;Comparable*&gt; 并不真正需要 swap... 它是自动推断的。 :)
  • 我的处理方法是先让它适用于整数,然后修改它以适用于其他类型。

标签: c++ quicksort


【解决方案1】:

根据您向我们展示的代码以及您对问题所在的评论,我唯一的猜测是fromto 并不代表您的想法。您的代码将to - from 作为要排序的段的长度。如果这是准确的(而不仅仅是枢轴选择的近似值),则意味着to 实际上指向的元素刚好在要排序的区域之外。这是合理的,但是swap&lt;Comparable*&gt;(*pivot, *(to)) 将把轴从列表的末尾换掉。

【讨论】:

  • 我正在通过在函数调用中调整它来解决指向指针关闭的问题...我可能应该在我的帖子中包含它...有没有办法解决这个问题快速排序功能不会丢失后续递归调用的索引?
猜你喜欢
  • 1970-01-01
  • 2016-12-23
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2014-10-10
相关资源
最近更新 更多