Вероятно, во всех реализациях std::sort
используется introsort (он же introspection sort ), гибридный алгоритм, который объединяет быструю сортировку и heapsort.Фактически, introsort был специально изобретен в 1997 году с целью реализации эффективной сортировки в C ++ STL.
Единственное, что требует стандарт, - это то, что std::sort
каким-то образом сортирует данные в соответствии суказанный порядок со сложностью O (N log (N)) ;он не гарантированно стабилен (есть отдельные std::stable_sort
доступные алгоритмы, если это необходимо).
Технически, introsort лучше соответствует требованию сложности, чем quicksort: это потому, что heapsort гарантированно O (N log (N)) сложность в наихудшем случае, тогда как для быстрой сортировки время наихудшего случая квадратичное.
Однако в среднем случае динамическая сортировка «медленнее», чем быстрая сортировка, в том смысле,что heapsort выполняет C * N log (N) , тогда как quicksort имеет производительность D * N log (n) , при этом D значительно меньше, чем C (числа C и D являются постоянными).Другими словами, накладные расходы на сравнение для сортировки выше, чем для быстрой сортировки.
Чтобы получить лучшее из обоих миров, интросорт начинается с быстрой сортировки - рекурсивного алгоритма - но когда глубина рекурсии становится слишком большойвысокий (что означает, что он попадает в вырожденное наихудшее поведение), он переключается на heapsort.
См. также запись в Википедии для introsort или оригинальная статья от Дэвида Муссера, который изобрел интросорт специально для STL.