Введение

Тип алгоритма сортировки, который работает путем сравнения пар элементов.

Сравнительный алгоритм сортировки — это тип алгоритма сортировки, который считывает элементы списка только посредством одной абстрактной операции сравнения (часто оператор "меньше или равно" или трехстороннее сравнение), определяющей, какой из двух элементов должен идти первым в окончательном отсортированном списке. Единственное требование заключается в том, что оператор формирует полный предзаказ данных, при этом: если a ≤ b и b ≤ c, то a ≤ c (транзитивность); для всех a и b, a ≤ b или b ≤ a (связность). Возможно, что a ≤ b и b ≤ a; в этом случае любой из них может оказаться первым в отсортированном списке. В стабильной сортировке входной порядок определяет отсортированный порядок в этом случае. Сортировки, изучаемые в литературе, являются "основанными на сравнении". Элементы a и b могут быть поменены местами или иным образом переупорядочены алгоритмом только тогда, когда порядок между этими элементами был установлен на основе результатов предыдущих сравнений. Это происходит, когда порядок между a и b может быть выведен посредством транзитивного замыкания этих предыдущих результатов сравнения. Для сортировок, основанных на сравнении, решение о выполнении основных операций, отличных от сравнений, основывается на результатах сравнений. Следовательно, при анализе времени количество выполненных сравнений используется для определения верхней границы оценок количества выполненных основных операций, таких как перестановки или присваивания, что известно как линейно-логарифмическое время. Это является следствием ограниченной информации, доступной только через сравнения, или, иными словами, нечеткой алгебраической структуры полностью упорядоченных множеств. В этом смысле сортировка слиянием, сортировка кучей и интросортировка асимптотически оптимальны с точки зрения количества сравнений, которые им необходимо выполнить, хотя эта метрика не учитывает другие операции. Сортировки, не основанные на сравнении (например, примеры, обсуждаемые ниже), могут достичь производительности O(n), используя операции, отличные от сравнений, что позволяет им обойти эту нижнюю границу (при условии, что элементы имеют постоянный размер). Сравнительные сортировки могут выполняться быстрее на некоторых списках; многие адаптивные сортировки, такие как сортировка вставками, выполняются за время O(n) на уже отсортированном или почти отсортированном списке. Нижняя граница Ω(n log n) применима только в том случае, если входной список может быть в любом возможном порядке. Реальные измерения скорости сортировки могут учитывать способность некоторых алгоритмов оптимально использовать относительно быструю кэшированную компьютерную память, или приложение может выиграть от методов сортировки, при которых отсортированные данные начинают быстро появляться перед пользователем (а затем скорость чтения пользователя будет ограничивающим фактором), в отличие от методов сортировки, при которых вывод недоступен, пока весь список не будет отсортирован. Несмотря на эти ограничения, сравнительные сортировки предлагают заметное практическое преимущество, заключающееся в том, что контроль над функцией сравнения позволяет сортировать множество различных типов данных и точно контролировать способ сортировки списка. Например, обращение результата функции сравнения позволяет сортировать список в обратном порядке; и можно отсортировать список кортежей в лексикографическом порядке, просто создав функцию сравнения, которая сравнивает каждую часть последовательно:
function tupleCompare((lefta, leftb, leftc), (righta, rightb, rightc)) {
if (lefta ≠ righta)
return compare(lefta, righta);
else if (leftb ≠ rightb)
return compare(leftb, rightb);
else
return compare(leftc, rightc);
}

Сравнительные сортировки, как правило, легче адаптируются к сложным порядкам, таким как порядок чисел с плавающей запятой. Кроме того, как только функция сравнения написана, любой алгоритм сравнительной сортировки может быть использован без изменений; сортировки, не основанные на сравнении, обычно требуют специализированных версий для каждого типа данных. Эта гибкость, в сочетании с эффективностью вышеупомянутых алгоритмов сравнительной сортировки на современных компьютерах, привела к широкому предпочтению сравнительных сортировок в большинстве практических задач.

Альтернативы

Некоторые задачи сортировки допускают решение, строго более быстрое, чем оценка Ω(n log n) для сортировки сравнением, используя сортировки без сравнения; примером является сортировка целых чисел, где все ключи – целые числа. Когда ключи образуют небольшой (по сравнению с n) диапазон, сортировка подсчётом является алгоритмом, работающим за линейное время. Другие алгоритмы сортировки целых чисел, такие как поразрядная сортировка, не являются асимптотически быстрее сортировки сравнением, но могут быть быстрее на практике. Задача сортировки пар чисел по их сумме также не подчиняется оценке Ω(n² log n) (квадрат возникает из-за образования пар); лучший известный алгоритм всё ещё требует O(n² log n) времени, но только O(n²) сравнений.