Сортировка

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

Разработано большое количество алгоритмов сортировки, реализованных на языках программирования высокого уровня. Реализации оперируют в качестве элементов множества элементами структуры данных, наиболее подходящей для того или иного алгоритма (в наиболее распространенной ситуации – одномерного массива). Отношение порядка на множестве может быть введено разными способами. Для т. н. примитивных типов (числа, символы) обычно существует естественный порядок (соответственно по возрастанию числа, по возрастанию значения кода символа в ASCII или Unicode). Для пользовательских типов данных необходимо такой порядок задать явно. Часто конструкции языка программирования позволяют это сделать несколькими способами.

Среди характеристик, важных для применения реализации того или иного алгоритма сортировки, следует выделить временну́ю сложность, объем дополнительно используемой памяти, т. н. устойчивость [свойство алгоритма сохранять взаимный порядок равных элементов (не переставлять их друг относительно друга в ходе работы алгоритма)].

Несложно доказывается, что при условии использования только лишь попарных сравнений элементов множества никакой алгоритм не может использовать в худшем случае меньше, чем таких сравнений для сортировки множества из элементов. Согласно формуле Стирлинга, , что даёт нижнюю оценку для сложности произвольного алгоритма сортировки, основанного на сравнениях (англ. comparison sort). См. также «О большое».

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

Примеры:

  1. «Квадратичные» сортировки. Название связано с тем, что в худшем случае для сортировки множества из элементов они требуют примерно попарных сравнений (с точностью до множителя и членов меньшего порядка). К таковым относятся сортировка пузырьком, сортировка выбором, сортировка вставками. Используются в основном в учебных целях либо для сортировки множеств, содержащих небольшое количество элементов.
  2. Сортировка слиянием (англ. Mergesort). Асимптотически оптимальный алгоритм, поскольку его сложность может быть оценена как . Кроме того, сортировка слиянием пригодна для использования в качестве т. н. внешней сортировки в ситуации, когда сортируемое множество не помещается в оперативной памяти целиком.
  3. Быстрая сортировка (англ. Quicksort; Хоар, 1960). Несмотря на то что не является асимптотически оптимальным алгоритмом, для многих исходных данных выполняется быстрее, например, сортировки слиянием. C доработками используется в библиотеках Java.

Литература

  • Кормен Т. Алгоритмы : построение и анализ / Т. Кормен, Ч. Лейзерсон, Р. Ривест ; пер. с англ.: К. Белов [и др.]. – Москва : МЦНМО, 2002. – (Классические учебники: computer science).
  • Кнут Д. Искусство программирования. Т. 3. Сортировка и поиск / пер. В. Т. Тертышного, И. В. Красикова. – Москва : Диалектика, 2019.
  • Седжвик Р. Алгоритмы на Java : пер. с англ. / Р. Седжвик, К. Уэйн. – 4-е изд. – Москва ; Санкт-Петербург : Диалектика, 2019.
Материалы портала bigenc.ru переданы в ведение АНО «Интернет-энциклопедия «РУВИКИ» на основе лицензионного соглашения. Возможны неточности в отображении материалов. Если у вас возникли вопросы или вы увидели ошибку, пожалуйста, сообщите нам на info@ruwiki.ru