Сложность быстрой сортировки

Гоша: Спасибо, Тимофей! Очень интересный алгоритм. Интересно, за сколько он работает?
Как вы думаете, какая сложность быстрой сортировки в худшем случае?
Предположим, дан массив чисел, который нужно отсортировать с помощью алгоритма быстрой сортировки. Но оказалось, массив уже отсортирован.
image
Допустим, вы взяли в качестве опорного самый первый элемент массива.
image
На первом шаге ведущий элемент 0. Чтобы получить три подмассива, нужно сравнить с опорным (n−1)(n - 1)(n−1) элемент.
image
На втором шаге примем за опорный элемент 3. Будет выполнено (n−2)(n - 2)(n−2) операции сравнения. На каждом шаге количество сравнений будет уменьшаться на 1. Когда останется 1 элемент в массиве, сравнивать его будет не с чем. Поэтому получится 0 операций сравнения.
Таким образом, чтобы посчитать общее количество сравнений, проделанных алгоритмом, нужно посчитать сумму:
(n−1)+(n−2)+(n−3)+...+1.(n - 1) + (n - 2) + (n - 3) + ... + 1.(n−1)+(n−2)+(n−3)+...+1.
Это сумма арифметической прогрессии. Её формула:
image
Если подставить в формулу получившиеся для алгоритма значения, получится n2−n2=O(n2).\displaystyle\frac{n^2 - n}{2}=O(n^2).2n2−n​=O(n2).
Получили сортировку, которая асимптотически работает ничуть не быстрее сортировки пузырьком, вставками или выбором!
Не всё так плохо. Посчитаем сложность алгоритма на том же примере, если опорный элемент на каждом шаге выбран удачно и разделит массив пополам.
image
На каждом шаге проделаем O(n)O(n)O(n) операций. Количество шагов деления (глубина рекурсии) составляет log⁡n\log nlogn. Если повезёт, и каждый раз будем выбирать центральный элемент, то основание логарифма будет 2.
Рассмотрим работу алгоритма на примере произвольного массива.
image
Также получим логарифмическое количество итераций. Общее быстродействие на практике: O(nlog⁡n)O(n \log n)O(nlogn).
Гоша: Как же выбрать опорный элемент?
Тимофей: Неплохой стратегией будет взять крайний левый элемент, крайний правый элемент, средний элемент и выбрать средний из них. Также хорошим вариантом является просто выбрать случайный элемент.
Решите задачи E, F: https://contest.yandex.ru/contest/18899/problems/E/