排序就是为了好玩,快速排序

Sorting for the heck of it -- Quicksort

本文关键字:快速排序 好玩 就是为了 排序      更新时间:2023-10-16

我们必须为自己的可比基类做一个优化的快速排序。我无论如何也不能使它成功。该算法似乎直截了当,但我不能看到我的代码工作。我有一个DateTime类扩展可比,我用它来测试和排序似乎工作,但每20个左右运行一个值是不合适的,当我使用插入排序对数组的块小于8整个排序被抛出不正常。

在我的分区方法中,当我将枢轴移到末尾并在开始和结束处开始指针时,它是有效的。我想将枢轴移动到end - 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;
}

从你给我们看的代码和你对问题的评论来看,我唯一的猜测是fromto并不意味着你想的那样。您的代码将to - from作为要排序的段的长度。如果这是准确的(而不仅仅是近似的枢轴选择),这将意味着to实际上是指向一个元素刚好超出区域排序。这是合理的,但swap<Comparable*>(*pivot, *(to))将交换枢轴从列表的末尾。