私は簡単なクイックソートの実装を持っています:
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);
}
}
}
std::sort
1000000要素の配列でテストすると、再帰で死ぬことがある前に、約30ミリ秒かかりますが、永遠に(6300ミリ秒)かかります。
確かに、私のくだらない実装が ほど速くなるとは思っていませんがstd::sort
、どうしてそんなに大きな違いがあるのでしょうか?
std::sort
単純なクイックソート(イントロソートだと思います)よりも複雑なものを使用して、再帰レベルなどを行き過ぎないようにすることを理解しています。しかし、それでも、そのような大きな違いを説明できる明らかな何かが欠けていますか?
矢印のサイズを変化させると、差分係数が一定ではないことがわかります。実際には のように大きくなるように見えn²
ます。