Быстрая сортировка — различия между версиями
(→Худшее время работы) |
(→Среднее время работы) |
||
| Строка 33: | Строка 33: | ||
===Среднее время работы=== | ===Среднее время работы=== | ||
| + | {{ | ||
| + | Лемма | ||
| + | |statement=Пусть Х - полное количество сравнений элементов с опорным за время работы сортировки. Тогда время работы сортировки равно <tex>O(n \log n)</tex>. | ||
| + | |proof=Нам необходимо вычислить полное количество сравнений. | ||
| + | Переименуем элементы массива как <tex>z_1...z_n</tex>, где <tex>z_i</tex> наименьший по порядку элемент. | ||
| + | Также введем множество <tex>Z_{ij} = \{z_i, z_{i+1}...z_j\}</tex>. | ||
| + | |||
| + | Поскольку каждая пара элементов срановается не более одного раза, полное количество сравнений выражается как | ||
| + | |||
| + | <tex>X = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} X_{ij}</tex> | ||
| + | |||
| + | Применим к обоим частям равенства операцию вычисления матожидания и воспользовавшись ее линейностью получим | ||
| + | |||
| + | <tex>E[X] = E\left[\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} X_{ij}\right] = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} E[X_{ij}] = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} Pr\{z_i</tex> сравнивается с <tex>z_j\}</tex> | ||
| + | |||
| + | Осталось вычислить величину <tex>Pr\{z_i</tex> сравнивается с <tex>z_j\}</tex>. | ||
| + | |||
| + | <tex>Pr\{z_i</tex> сравнивается с <tex>z_j\} = | ||
| + | Pr\{</tex> первым опорным элементом был <tex>z_i</tex> или <tex>z_j\} = | ||
| + | Pr\{</tex> первым опорным элементом был <tex>z_i\} + | ||
| + | Pr\{</tex> первым опорным элементом был <tex>z_j\} = | ||
| + | \frac {1}{j-i+1} + \frac {1}{j-i+1} = \frac {2}{j-i+1} </tex> | ||
| + | |||
| + | <tex> E[X] = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} \frac {2}{j-i+1} = \sum\limits_{i=1}^{n-1}\sum\limits_{k=1}^{n-i} \frac 2{k+1} < \sum\limits_{i=1}^{n-1}\sum\limits_{k=1}^{n-i} \frac 2{k} = \sum\limits_{i=1}^{n-1}O(\log n) = O(n \log n)</tex> | ||
| + | }} | ||
| + | Таким образом матожидание времени работы быстрой сортировки будет <tex>O(n \log n)</tex>. | ||
==Ссылки== | ==Ссылки== | ||
Версия 00:48, 16 июня 2011
Быстрая сортировка(qsort, сортировка Хоара) - один из самых известных и широко используемых алгоритмов сортировки. Среднее время работы , что является асимптотически оптимальным временем работы для алгоритма, основанного на сравнении.
Содержание
Алгоритм
- Выбираем опорный элемент.
- Разбиваем массив таким образом, что все элементы меньшие или равные опорному будут лежать левее опроного элемента, а большие или равные правее.
- Рекурсивно сотрируем "маленькие" и "большие" элементы.
Оптимизация глубины рекурсии до O(logn) в худшем случае
В случае повторяющихся неудачных разбиений опорным элементом, глубина рекурсии может достичь . Этого можно избежать, если в цикле разбивать массив, но рекурсивно вызываться только от части, содержащей меньшее число элементов, а большую часть продолжать разбивать в цикле.
Асимптотика
Худшее время работы
Обозначим худшее время работы за . Получим рекуррентное соотношение
,где , так как мы разбиваемся на 2 подзадачи.
Предположим, что . Тогда получим
Заметим, что принимает максимальное значение на концах интервала [0; n-1], что позволяет нам сделать оценку
Подставим это в наше выражение для
Таким образом .
Среднее время работы
| Лемма: |
Пусть Х - полное количество сравнений элементов с опорным за время работы сортировки. Тогда время работы сортировки равно . |
| Доказательство: |
|
Нам необходимо вычислить полное количество сравнений. Переименуем элементы массива как , где наименьший по порядку элемент. Также введем множество . Поскольку каждая пара элементов срановается не более одного раза, полное количество сравнений выражается как
Применим к обоим частям равенства операцию вычисления матожидания и воспользовавшись ее линейностью получим сравнивается с Осталось вычислить величину сравнивается с . сравнивается с первым опорным элементом был или первым опорным элементом был первым опорным элементом был |
Таким образом матожидание времени работы быстрой сортировки будет .
Ссылки
http://ru.wikipedia.org/wiki/Быстрая_сортировка
http://en.wikipedia.org/wiki/Quicksort
Литература
- Т. Кормен, Ч. Лейзерсон, Р. Ривест: Алгоритмы: построение и анализ глава 7