Никогда не выбирайте фиксированную точку поворота - на нее можно напасть, чтобы использовать наихудший вариант времени выполнения алгоритма O (n ^ 2), который просто вызывает проблемы. Наихудший случай выполнения быстрой сортировки происходит, когда разбиение приводит к одному массиву из 1 элемента и одному массиву из n-1 элементов. Предположим, вы выбрали первый элемент в качестве раздела. Если кто-то передает массив в ваш алгоритм в порядке убывания, ваш первый круг будет самым большим, поэтому все остальное в массиве будет перемещаться влево от него. Затем, когда вы вернетесь, первый элемент снова станет самым большим, так что вы снова поместите все слева от него и т. Д.
Лучшей техникой является метод медиана-3, где вы выбираете три элемента случайным образом и выбираете середину. Вы знаете, что выбранный вами элемент не будет первым или последним, но, по теореме о центральном пределе, распределение среднего элемента будет нормальным, что означает, что вы будете стремиться к середине (и, следовательно, , n lg n time).
Если вы абсолютно хотите гарантировать время выполнения O (nlgn) для алгоритма, метод столбцов 5 для нахождения медианы массива выполняется за время O (n), что означает, что рекуррентное уравнение для быстрой сортировки в в наихудшем случае будет T (n) = O (n) (найти медиану) + O (n) (разбиение) + 2T (n / 2) (рекурсивно влево и вправо.) По основной теореме это O (n). LG N). Тем не менее, постоянный коэффициент будет огромным, и если производительность в худшем случае является вашей главной задачей, используйте вместо этого сортировку слиянием, которая в среднем лишь немного медленнее, чем быстрая сортировка, и гарантирует время O (nlgn) (и будет намного быстрее). чем эта хромая быстрая сортировка).
Объяснение алгоритма медианы медиан