Примечание : стандартная быстрая сортировка не O (n log n)! В худшем случае это может занять до O (n ^ 2) времени. Проблема в том, что вы можете поворачиваться на элементе, который далек от медианы, поэтому ваши рекурсивные вызовы сильно разбалансированы.
Существует способ борьбы с этим, который заключается в тщательном подборе медианы, которая гарантированно или, по крайней мере, очень вероятно, будет близка к медиане. Удивительно, что на самом деле вы можете найти точную медиану в линейном времени, хотя в вашем случае это звучит так, как будто вы заботитесь о скорости, поэтому я бы не советовал этого.
Я считаю, что наиболее практичный подход заключается в реализации стабильно быстрой сортировки (это легко держать стабильный), но использовать медиану 5 случайных значений в качестве оси поворота на каждом шаге. Это делает маловероятным, что у вас будет медленная сортировка, и она стабильна.
Кстати, сортировка слиянием может быть выполнена на месте, хотя сложно и на месте, и на стабильном уровне.