Ответ 1
Прежде всего: компиляторы не предоставляют никакой реализации std::sort
. Хотя традиционно каждый компилятор поставляется в комплекте с реализацией стандартной библиотеки (которая в значительной степени зависит от встроенных компиляторов), теоретически вы можете поменять одну реализацию на другую. Один очень хороший пример - Clang компилирует libstdc++ (традиционно упакованный с gcc) и libc++ (совершенно новый).
Теперь, когда это не так...
std::sort
традиционно был реализован как интро-сортировка. С точки зрения высокого уровня это означает относительно стандартную реализацию быстрой сортировки (с некоторым медианным зондированием, чтобы избежать наихудшего случая O (n 2)) в сочетании с процедурой сортировки вставкой для небольших входных данных. Однако реализация libc++ немного отличается и ближе к TimSort: она обнаруживает уже отсортированные последовательности во входах и избегает их повторной сортировки, что приводит к поведению O (n) на полностью отсортированном входе. Он также использует оптимизированные сети сортировки для небольших входов.
std::stable_sort
другой стороны, std::stable_sort
более сложный характер. Это можно экстраполировать из самой формулировки Стандарта: сложность составляет O (n log n), если может быть выделено достаточно дополнительной памяти (намекает на сортировку слиянием), но вырождается в O (n log 2 n), если нет.