Я вижу, что никто не упомянул introsort , который решает наихудший случай быстрой сортировки O(n^2)
путем переключения на heapsort , когда глубина рекурсии превышает определенный порог. Это означает, что быстрая сортировка не даст возможности выродиться, поскольку ее количество рекурсивных вызовов определенно будет ограничено.
Другая оптимизация заключается в переключении на сортировку вставок всякий раз, когда число элементов последовательности, в которой вы находитесь в данный момент, мало (скажем, 16).
Вот так может выглядеть интросорт:
void Introsort(int A[], int N, int left, int right, int depth)
{
if ( left < right ) // note: this doesn't switch to insertion sort if right - left is small enough
{
if ( (1 << depth) > N )
Heapsort(A, left, right);
else
{
int P = Partition(A, left, right);
Introsort(A, N, left, P, depth+1);
Introsort(A, N, P+1, right, depth+1);
}
}
}
Это, в сочетании с хорошей функцией разбиения (просто случайный выбор оси должен быть достаточным для большинства целей), даст вам очень быстрый алгоритм сортировки.
Существует также выбор radix sort , который работает очень хорошо, особенно если ваши поплавки не слишком велики. Однако из того, что я видел, для радикальной сортировки требуются миллионы элементов, чтобы превзойти интросорт.