Я знаю, что quicksort имеет среднюю временную сложность O(n log n)
. Псевдо-quicksort (который является только быстрой сортировкой, когда вы смотрите на нее достаточно далеко, с достаточно высоким уровнем абстракции), который часто используется для демонстрации краткости функциональных языков, выглядит следующим образом (данный в Haskell):
quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (p:xs) = quicksort [y | y<-xs, y<p] ++ [p] ++ quicksort [y | y<-xs, y>=p]
Хорошо, поэтому я знаю, что эта вещь имеет проблемы. Самая большая проблема заключается в том, что он не сортируется, что обычно является большим преимуществом quicksort. Даже если это не имеет значения, все равно потребуется больше времени, чем типичная быстродействующая сортировка, потому что она должна делать два прохода списка, когда он их разделяет, и он делает дорогостоящие операции добавления, чтобы объединить их обратно вместе. Кроме того, выбор первого элемента в качестве стержня не является лучшим выбором.
Но даже учитывая все это, не средняя временная сложность этой быстрой сортировки такая же, как стандартная quicksort? А именно, O(n log n)
? Поскольку добавление и раздел по-прежнему имеют линейную временную сложность, даже если они неэффективны.