我有一个简单的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
使用的东西比简单的快速排序更复杂(我相信它是内向的)可以防止递归级别和内容过多。但是,是否有一些我不知道的东西可以解释如此巨大的差异?
改变箭头的大小表明差异因子不是常数,实际上它似乎像n²
一样增长。
答案 0 :(得分:1)
假设代码是正确的(快速排序可能很棘手),那么我猜最大的区别是当元素数量很少时你没有使用更快的排序。例如,当要排序的元素数小于某个小数时,使用选择排序是很常见的。
那个狡猾的C ++ 11代码也让我很怀疑,虽然我会坦然承认它一无所知。
答案 1 :(得分:1)
首先检查更好的枢轴选择(通常使用3的中间值)并消除递归的一个分支以节省堆栈空间。
枢轴选择对整体算法性能影响最大,因为它使N * log(n)和N ^ 2之间存在差异。