Во-первых, определение, поскольку оно очень важно: стабильная сортировка - это та, которая гарантированно не переупорядочивает элементы с одинаковыми ключами.
Рекомендации:
Быстрая сортировка: когда вам не нужна стабильная сортировка, а средняя производительность важнее, чем худшая. Быстрая сортировка - это O (N log N) в среднем, O (N ^ 2) в худшем случае. Хорошая реализация использует O (log N) вспомогательное хранилище в форме стекового пространства для рекурсии.
Сортировка слиянием: если вам нужна стабильная сортировка O (N log N), это ваш единственный вариант. Единственным недостатком является то, что он использует O (N) вспомогательное пространство и имеет немного большую константу, чем быстрая сортировка. Есть несколько видов слияний на месте, но AFAIK все они либо нестабильны, либо хуже, чем O (N log N). Даже O (N log N) на месте сортировки имеют намного большую константу, чем обычная сортировка слиянием, что они скорее теоретические курьезы, чем полезные алгоритмы.
Сортировка кучи: когда вам не нужна стабильная сортировка, и вы больше заботитесь о производительности в худшем случае, чем в среднем. Он гарантированно равен O (N log N) и использует O (1) вспомогательное пространство, что означает, что вы не будете неожиданно исчерпывать пространство кучи или стека на очень больших входах.
Introsort: это быстрая сортировка, которая переключается на сортировку кучи после определенной глубины рекурсии, чтобы обойти O (N ^ 2) наихудшего случая быстрой сортировки. Это почти всегда лучше, чем обычная старая быстрая сортировка, поскольку вы получаете средний случай быстрой сортировки с гарантированной производительностью O (N log N). Вероятно, единственная причина использовать сортировку кучи вместо этого - в системах с жестким ограничением памяти, где пространство стека O (log N) практически значимо.
Вставка сортировки : когда N гарантированно будет небольшим, в том числе в качестве базового варианта быстрой сортировки или сортировки слиянием. Хотя это O (N ^ 2), оно имеет очень маленькую константу и является устойчивой сортировкой.
Сортировка по пузырям, сортировка по выбору : когда вы делаете что-то быстрое и грязное, и по какой-то причине вы не можете просто использовать алгоритм сортировки стандартной библиотеки. Единственное преимущество, которое они имеют перед сортировкой вставок, заключается в том, что их немного проще реализовать.
Несопоставимые сортировки: при некоторых довольно ограниченных условиях можно преодолеть барьер O (N log N) и отсортировать по O (N). Вот несколько случаев, когда стоит попробовать:
Подсчет сортировки: когда вы сортируете целые числа с ограниченным диапазоном.
Сортировка по корням: когда log (N) значительно больше, чем K, где K - количество радикальных цифр.
Сортировка по сегментам: когда вы можете гарантировать, что ваши входные данные распределены приблизительно равномерно.