Академический Документы
Профессиональный Документы
Культура Документы
quicksort)
Ref: https://dic.academic.ru/dic.nsf/ruwiki/46738
Алгоритм
Быстрая сортировка использует стратегию «разделяй и властвуй». Шаги
алгоритма таковы:
1. Выбираем в массиве некоторый элемент, который будем называть
опорным элементом. С точки зрения корректности алгоритма выбор опорного
элемента безразличен. С точки зрения повышения эффективности
алгоритма выбираться должна медиана, но без дополнительных сведений о
сортируемых данных её обычно невозможно получить. Известные
стратегии: выбирать постоянно один и тот же элемент, например, средний
или последний по положению; выбирать элемент со случайно выбранным
индексом.
Оценка эффективности
QuickSort является существенно улучшенным вариантом алгоритма
сортировки с помощью прямого обмена (его варианты известны как
«Пузырьковая сортировка» и «Шейкерная сортировка»), известного, в
том числе, своей низкой эффективностью. Принципиальное отличие
состоит в том, что после каждого прохода элементы делятся на две
независимые группы. Любопытный факт: улучшение самого
неэффективного прямого метода сортировки дало в результате
эффективный улучшенный метод.
Достоинства и недостатки
Достоинства:
Один из самых быстродействующих (на практике) из алгоритмов
внутренней сортировки общего назначения.
Прост в реализации.
Требует лишь O(Lgn) дополнительной памяти для своей работы. (Не
улучшенный рекурсивный алгоритм в худшем случае O(n) памяти)
Хорошо сочетается с механизмами кэширования и виртуальной
памяти.
Существует эффективная модификация (алгоритм Седжвика) для
сортировки строк — сначала сравнение с опорным элементом только по
нулевому символу строки, далее применение аналогичной сортировки для
«большего» и «меньшего» массивов тоже по нулевому символу, и для
«равного» массива по уже первому символу.
Работает на связанных списках и других структурах с
последовательным доступом.
Недостатки:
Сильно деградирует по скорости (до n2) при неудачных выборах
опорных элементов, что может случиться при неудачных входных данных.
Этого можно избежать, используя такие модификации алгоритма, как
Introsort, или вероятностно, выбирая опорный элемент случайно, а не
фиксированным образом.
Наивная реализация алгоритма может привести к ошибке
переполнения стека, так как ей может потребоваться сделать O(n)
вложенных рекурсивных вызовов. В улучшенных реализациях, в которых
рекурсивный вызов происходит только для сортировки меньшей из двух
частей массива, глубина рекурсии гарантированно не превысит
.
Неустойчив — если требуется устойчивость, приходится расширять
ключ.