Содержание

Быстрая сортировка

Анимированная схема алгоритма

Быстрая сортировка (англ. quicksort), часто называемая qsort по имени реализации в стандартной библиотеке языка Си — широко известный алгоритм сортировки, разработанный английским информатиком Чарльзом Хоаром. Один из быстрых известных универсальных алгоритмов сортировки массивов (в среднем O(n log n) обменов при упорядочении n элементов), хотя и имеющий ряд недостатков.

Краткое описание алгоритма

Алгоритм

Быстрая сортировка использует стратегию «разделяй и властвуй». Шаги алгоритма таковы:

  1. Выбираем в массиве некоторый элемент, который будем называть опорным элементом. С точки зрения корректности алгоритма выбор опорного элемента небезразличен, т.к. можно подобрать пример, при котором алгоритм с выбором медианы в качестве опорного элемента будет выдавать неправильный ответ. Известные стратегии: выбирать постоянно один и тот же элемент, например, последний по положению; выбирать элемент со случайно выбранным индексом.
  2. Операция разделения массива: реорганизуем массив таким образом, чтобы все элементы, меньшие или равные опорному элементу, оказались слева от него, а все элементы, большие опорного — справа от него. Обычный алгоритм операции:
    1. два индекса — l и r, приравниваются к минимальному и максимальному индексу разделяемого массива соответственно;
    2. вычисляется опорный элемент m;
    3. индекс l последовательно увеличивается до m или до тех пор, пока l-й элемент не превысит опорный;
    4. индекс r последовательно уменьшается до m или до тех пор, пока r-й элемент не окажется меньше опорного;
    5. если r = l — найдена середина массива — операция разделения закончена, оба индекса указывают на опорный элемент;
    6. если l < r — найденную пару элементов нужно обменять местами и продолжить операцию разделения с тех значений l и r, которые были достигнуты. Следует учесть, что если какая-либо граница (l или r) дошла до опорного элемента, то при обмене значение m изменяется на r или l соответственно.
  3. Рекурсивно упорядочиваем подмассивы, лежащие слева и справа от опорного элемента.
  4. Базой рекурсии являются наборы, состоящие из одного или двух элементов. Первый возвращается в исходном виде, во втором, при необходимости, сортировка сводится к перестановке двух элементов. Все такие отрезки уже упорядочены в процессе разделения.

Поскольку в каждой итерации (на каждом следующем уровне рекурсии) длина обрабатываемого отрезка массива уменьшается, по меньшей мере, на единицу, терминальная ветвь рекурсии будет достигнута всегда и обработка гарантированно завершится. Интересно, что Хоар разработал этот метод применительно к машинному переводу: дело в том, что в то время словарь хранился на магнитной ленте, и если упорядочить все слова в тексте, их переводы можно получить за один прогон ленты.

Оценка эффективности

QuickSort является существенно улучшенным вариантом алгоритма сортировки с помощью прямого обмена (его варианты известны как «Пузырьковая сортировка» и «Шейкерная сортировка»), известного, в том числе, своей низкой эффективностью. Принципиальное отличие состоит в том, что в первую очередь меняются местами наиболее удалённые друг от друга элементы массива. Любопытный факт: улучшение самого неэффективного прямого метода сортировки дало в результате самый эффективный улучшенный метод.

Улучшения

Достоинства и недостатки

Достоинства:

Недостатки:

С учетом склонности qsort к деградации, сортировка Шелла на практике зачастую оказывается более удачным выбором для наборов до ~1000 элементов. Кроме того, сортировка Шелла не требует дополнительной памяти. Если же производительность важнее, чем экономия памяти, то как правило сортировка слиянием (merge sort), оказывается более удачным выбором, чем qsort, ввиду меньшей склонности к деградации, более оптимального паттерна выделения дополнительной памяти, и точно такой же скорости лучшего случая в O(n * log n).

Ссылки

Qsort в википедии

Лабырдин Сергей 11а 2009