Задать вопрос
@SilentGr0ve
Первокурсник

Можно ли добиться постоянного O(nlogn) для квиксорта в любом случае?

Можно ли добиться постоянного O(nlogn) для квиксорта в любом случае?
  • Вопрос задан
  • 65 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 4
@Everything_is_bad
Элементарно же, давай включим логику, про O(n log n) известно что это в среднем, значит есть случаи, когда это не работает, отсюда вывод, постоянного O(n log n) для квиксорта в любом случае не добиться.
Ответ написан
Dual-Pivot Quicksort должен решать проблему с почти отсортированными массивами, но у него тоже существует worst case сценарий с n^2 (массив уже отсортирован полностью по убыванию либо возрастанию), но этого хотя бы можно избежать, добавив проверку, что массив уже отсортирован (делается в один проход)
Ответ написан
Комментировать
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Да, можно. Для этого надо в качестве pivot'а выбрать медиану. если это сделать за O(n) в худшем случае, то общая сложность QuickSort'а будет O(n log n).

Для выбора медианы за O(n) есть, например, вот такой алгоритм. В каких-то источниках его еще называли алгоритмом кнута-пратта-мориса-ривеста-тарьяна. Кажется, но я их найти не могу, так что я какие-то фамилии напутал, но помню, что там было 5 великих информатиков.

На практике же это не применяют, потому что этот алгоритм хоть и имеет линейную сложность в худшем, константа там такая, что там на квадрат хватит и еще на логарифм сверху останется. Просто используя какие-нибудь случайные числа можно добиться гораздо лочшей производительности.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Наиболее распространённый метод — IntroSort. Если рекурсия ушла глубоко, переключиться на другой метод. Постоянные n log n и не теряются классные свойства QuickSort.

Да, есть методы именно на быстрой сортировке, но, видимо, умные люди всё испытали и ничего лучшего не нашли.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы