Быстрая сортировка — различия между версиями
| Строка 10: | Строка 10: | ||
В случае повторяющихся неудачных разбиений опорным элементом, глубина рекурсии может достичь <Tex>O(n)</Tex>. Этого можно избежать, если в цикле разбивать массив, но рекурсивно вызываться только от части, содержащей меньшее число элементов, а большую часть продолжать разбивать в цикле. | В случае повторяющихся неудачных разбиений опорным элементом, глубина рекурсии может достичь <Tex>O(n)</Tex>. Этого можно избежать, если в цикле разбивать массив, но рекурсивно вызываться только от части, содержащей меньшее число элементов, а большую часть продолжать разбивать в цикле. | ||
| + | ==Асимптотика== | ||
| + | ===Худшее время работы=== | ||
| + | Обозначим худшее время работы за <tex>T(n)</tex>. Получим рекуррентное соотношение | ||
| + | |||
| + | <tex>T(n) = Max(T(q)+T(n-q-1))+\Theta(n)</tex>,где <tex>0 \leq q \leq n-1</tex>, | ||
| + | так как мы разбиваемся на 2 подзадачи. | ||
| + | Предположим, что <tex>T(n) \leq c(n^2)</tex>. Тогда получим | ||
| + | |||
| + | <tex>T(n) \leq Max(cq^2+c(n-q-1)^2)+\Theta(n) = | ||
| + | cMax(q^2+(n-q-1)^2)+\Theta(n)</tex> | ||
| + | |||
| + | Заметим, что <tex>q^2+(n-q-1)^2</tex> принимает максимальное значение на концах интервала [0; n-1], что позволяет нам сделать оценку | ||
| + | |||
| + | <tex>Max(q^2+(n-q-1)^2) \leq (n-1)^2</tex> | ||
| + | |||
| + | Подставим это в наше выражение для <tex>T(n)</tex> | ||
| + | |||
| + | <tex>T(n) \leq cn^2 - c(2n-1) + \Theta(n) \leq cn^2</tex> | ||
| + | |||
| + | Таким образом <tex>T(n) = O(n^2)</tex>. | ||
| + | ===Среднее время работы=== | ||
==Ссылки== | ==Ссылки== | ||
Версия 23:55, 15 июня 2011
Быстрая сортировка(qsort, сортировка Хоара) - один из самых известных и широко используемых алгоритмов сортировки. Среднее время работы , что является асимптотически оптимальным временем работы для алгоритма, основанного на сравнении.
Содержание
Алгоритм
- Выбираем опорный элемент.
- Разбиваем массив таким образом, что все элементы меньшие или равные опорному будут лежать левее опроного элемента, а большие или равные правее.
- Рекурсивно сотрируем "маленькие" и "большие" элементы.
Оптимизация глубины рекурсии до O(logn) в худшем случае
В случае повторяющихся неудачных разбиений опорным элементом, глубина рекурсии может достичь . Этого можно избежать, если в цикле разбивать массив, но рекурсивно вызываться только от части, содержащей меньшее число элементов, а большую часть продолжать разбивать в цикле.
Асимптотика
Худшее время работы
Обозначим худшее время работы за . Получим рекуррентное соотношение
,где , так как мы разбиваемся на 2 подзадачи. Предположим, что . Тогда получим
Заметим, что принимает максимальное значение на концах интервала [0; n-1], что позволяет нам сделать оценку
Подставим это в наше выражение для
Таким образом .
Среднее время работы
Ссылки
http://ru.wikipedia.org/wiki/Быстрая_сортировка
http://en.wikipedia.org/wiki/Quicksort
Литература
- Т. Кормен, Ч. Лейзерсон, Р. Ривест: Алгоритмы: построение и анализ глава 7