`std :: sort`在内部使用什么魔法使它更快?

时间:2013-04-28 13:34:02

标签: c++ performance sorting implementation

我有一个简单的quicksort实现:

template <typename IteratorType>
void quicksort(IteratorType begin, IteratorType end)
{
  if (begin != end)
  {
    const auto pivot = *(begin + distance(begin, end) / 2);
    const IteratorType sep = std::partition(begin, end, [pivot](typename IteratorType::value_type v){ return (v < pivot); });

    if (sep != begin)
    {
      quicksort(begin, sep);
    }

    if (sep != end)
    {
      quicksort(sep + 1, end);
    }
  }
}

在1000000个元素数组上测试它需要永远(6300毫秒)才有时会死于递归,而std::sort需要30毫秒。

当然,我不希望我的糟糕实现与std::sort一样快,但又怎么会有这么大的差异呢?

我理解std::sort使用的东西比简单的快速排序更复杂(我相信它是内向的)可以防止递归级别和内容过多。但是,是否有一些我不知道的东西可以解释如此巨大的差异?

改变箭头的大小表明差异因子不是常数,实际上它似乎像一样增长。

2 个答案:

答案 0 :(得分:1)

假设代码是正确的(快速排序可能很棘手),那么我猜最大的区别是当元素数量很少时你没有使用更快的排序。例如,当要排序的元素数小于某个小数时,使用选择排序是很常见的。

那个狡猾的C ++ 11代码也让我很怀疑,虽然我会坦然承认它一无所知。

答案 1 :(得分:1)

首先检查更好的枢轴选择(通常使用3的中间值)并消除递归的一个分支以节省堆栈空间。

枢轴选择对整体算法性能影响最大,因为它使N * log(n)和N ^ 2之间存在差异。