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