Comments 28
Когда я читал, там был TeamSort, который мне неизвестен.
А если вы про него знаете, то странно, что вы не обсуждаете его, потому что он обладает описанным качеством (и в пределе на отсортированных данных имеет линейное время выполнения), но при этом имеет худший случай с n log n.
Есть такая теорема, что если мы считаем QuickSort недетерминированным (случайный выбор элемента для partition на каждом шаге), а потом посчитаем среднее время для всех возможных стартовых сидов этого случайного алгоритма, то мы действительно получим n log(n). Тоесть, в каком-то смысле QS «всреднем» эффективен, а «неудобная область» для него довольно мала.
Но в этом случае:
1) Нужно обговорить что мы имеем ввиду под «показатель производительности». Это может быть и не сложность алгоритма.
2) Нельзя использовать O-нотацию.
3) Вообще, упомянуть эти вещи
Ну и еще могу набросать претензий. А пока статья выглядит как школьная домашняя работа в духе «посмотрите, что я узнал за летние каникулы».
А О нотация — это просто нотация. Ей можно характеризовать и теоретическую и практическую производительность, но с оговорками.
Обычно они совпадают и оговорок не требуется.
А статья — да, согласен, школьная. Другие у автора получше.
Вообще говоря, теоретически, можно выбирать медиану за O(n) и тогда квиксорт работает за O(n log n) в худшем случае. Этого никто не делает, потому что на практике получается сильно медленнее из-за офигенно большой константы линейного поиска медианы.
Если тупо выбирать случайный pivot, то вероятность быть заметно медленее n log n пренебрежимо мала.
Нет, алгоритм по ссылке — именно находит медиану (вернее любую к-ую порядковую статистику) за O(n). Медиана медиан в нем используется в качестве разделителя, чтобы две половины были достаточно равные.
Цена естественности или как обогнать QuickSort