Открыть сервис

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

Быстрая сортировка (англ. quicksort), часто называемая сортировкой Хоара, — это эффективный алгоритм сортировки, относящийся к классу алгоритмов «разделяй и властвуй». Разработанный в 1960 году британским информатиком Чарльзом Энтони Ричардом Хоаром, он является одним из самых широко используемых алгоритмов сортировки в вычислительной технике благодаря своей высокой производительности на практике. В среднем быстрая сортировка выполняет O(n log n) сравнений, что делает её значительно быстрее простых алгоритмов (например, пузырьковой сортировки) на больших массивах данных. Однако в худшем случае её сложность составляет O(n²), что является её основным недостатком.

История

Алгоритм быстрой сортировки был изобретён Ч. А. Р. Хоаром в 1960 году во время его работы над машинным переводом в Университете Кембриджа. Первоначально алгоритм был разработан для сортировки слов в русско-английском словаре. Хоар опубликовал описание алгоритма в 1961 году в статье «Algorithm 64: Quicksort» в журнале Communications of the ACM. Название «быстрая сортировка» (quicksort) было дано самим автором и отражает её ключевое преимущество — скорость работы на практике по сравнению с существовавшими на тот момент методами.

В последующие десятилетия алгоритм многократно анализировался и улучшался. Были предложены различные стратегии выбора опорного элемента (пивота), методы оптимизации для малых подмассивов (например, переход на сортировку вставками), а также модификации для работы со связанными списками и параллельными вычислениями. Алгоритм лёг в основу стандартной библиотечной функции qsort в языке C и является частью многих других стандартных библиотек.

Принцип работы

Быстрая сортировка основана на рекурсивном применении парадигмы «разделяй и властвуй». Основная идея заключается в выборе одного элемента массива, называемого опорным (pivot), и перераспределении остальных элементов таким образом, чтобы все элементы, меньшие опорного, оказались слева от него, а все большие — справа. Этот процесс называется разделением (partitioning). После этого алгоритм рекурсивно применяется к левой и правой частям массива.

Алгоритм разделения (схема Ломуто)

Существует несколько вариантов реализации процедуры разделения. Наиболее простая для понимания — схема Ломуто (Nico Lomuto). Она использует один индекс для прохода по массиву и второй для фиксации границы меньших элементов.

  1. Выбирается опорный элемент (обычно последний элемент массива).
  2. Устанавливается указатель i на начало массива (индекс первого элемента).
  3. Для каждого элемента j от начала до предпоследнего:
  1. По окончании цикла опорный элемент (последний) меняется местами с элементом arr[i]. Теперь опорный элемент находится на своей окончательной позиции, а все элементы слева от него меньше или равны ему, справа — больше.

Алгоритм разделения (схема Хоара)

Более эффективная и широко используемая — оригинальная схема Хоара. Она использует два указателя, движущихся навстречу друг другу.

  1. Выбирается опорный элемент (часто средний элемент массива).
  2. Устанавливаются два указателя: left на начало массива и right на конец.
  3. Указатель left движется вправо, пока не найдёт элемент, больший или равный опорному.
  4. Указатель right движется влево, пока не найдёт элемент, меньший или равный опорному.
  5. Если left <= right, элементы на этих позициях меняются местами, указатели сдвигаются (left++ и right--).
  6. Шаги 3-5 повторяются, пока left не станет больше right.
  7. Рекурсия применяется к подмассивам от начала до right и от left до конца.

Схема Хоара выполняет в среднем в три раза меньше обменов, чем схема Ломуто, и считается стандартной реализацией.

Выбор опорного элемента

Выбор опорного элемента критически влияет на производительность алгоритма. Идеальный случай — когда опорный элемент делит массив на две равные (или почти равные) части.

Сложность алгоритма

Оптимизации

Для повышения эффективности и предотвращения наихудших случаев применяются различные оптимизации:

Применение

Быстрая сортировка является одним из наиболее распространённых алгоритмов сортировки общего назначения. Она используется:

Критика и недостатки

Несмотря на свою популярность, быстрая сортировка имеет несколько недостатков:

Источники

  1. Hoare, C. A. R. (1961). Algorithm 64: Quicksort. Communications of the ACM, 4(7), 321.
  2. Sedgewick, R. (1978). Implementing Quicksort programs. Communications of the ACM, 21(10), 847-857.
  3. Bentley, J. L., & McIlroy, M. D. (1993). Engineering a sort function. Software: Practice and Experience, 23(11), 1249-1265.
  4. Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. (2013). Алгоритмы: построение и анализ (3-е изд.). Вильямс.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →