我们必须为自己的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;
}
答案 0 :(得分:4)
从您向我们展示的代码和您对错误的评论,我唯一的猜测是from
和to
并不代表您的想法。您的代码具有to - from
作为要排序的细分的长度。如果这是确切的(并且不仅仅是枢轴选择的近似值),那意味着to
实际上指向了要排序的区域之外的元素。这是合理的,但是swap<Comparable*>(*pivot, *(to))
会将轮轴交换到列表的末尾。