Быстрая сортировка — различия между версиями
| Строка 10: | Строка 10: | ||
Quicksort(A, p, r) | Quicksort(A, p, r) | ||
if p < r | if p < r | ||
| − | then q | + | then q = Partition(A, p, r) |
Quicksort(A, p, q) | Quicksort(A, p, q) | ||
Quicksort(A, q + 1, r) | Quicksort(A, q + 1, r) | ||
</wikitex> | </wikitex> | ||
| − | Для сортировки всего массива необходимо выполнить процедуру Quicksort(A, 1, length[A]). | + | Для сортировки всего массива необходимо выполнить процедуру <tex>Quicksort(A, 1, length[A])</tex>. |
| + | |||
| + | ===Разбиение массива=== | ||
| + | Основной шаг алгоритма сортировки {{---}} процедура <tex>Partition</tex>, которая переставляет элементы массива <tex>A[p..r]</tex> нужным образом: | ||
| + | <wikitex> | ||
| + | Partition(A, p, r) | ||
| + | x = A[p] | ||
| + | i = p - 1 | ||
| + | j = r + 1 | ||
| + | while true | ||
| + | do repeat j = j - 1 | ||
| + | until A[j] \le x | ||
| + | repeat i = i + 1 | ||
| + | until A[i] > x | ||
| + | if i < j | ||
| + | then поменять A[i] и A[j] | ||
| + | else return j | ||
| + | </wikitex> | ||
Версия 20:06, 24 мая 2012
Быстрая сортировка(qsort, сортировка Хоара) - один из самых известных и широко используемых алгоритмов сортировки. Среднее время работы , что является асимптотически оптимальным временем работы для алгоритма, основанного на сравнении.
Содержание
Алгоритм
- из массива выбирается некоторый опорный элемент .
- запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные , влево от него, а все ключи, большие, либо равные — вправо.
- для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру..
Псевдокод
<wikitex>
Quicksort(A, p, r)
if p < r
then q = Partition(A, p, r)
Quicksort(A, p, q)
Quicksort(A, q + 1, r)
</wikitex> Для сортировки всего массива необходимо выполнить процедуру .
Разбиение массива
Основной шаг алгоритма сортировки — процедура , которая переставляет элементы массива нужным образом: <wikitex>
Partition(A, p, r)
x = A[p]
i = p - 1
j = r + 1
while true
do repeat j = j - 1
until A[j] \le x
repeat i = i + 1
until A[i] > x
if i < j
then поменять A[i] и A[j]
else return j
</wikitex>
Оптимизация глубины рекурсии до O(logn) в худшем случае
В случае повторяющихся неудачных разбиений опорным элементом, глубина рекурсии может достичь . Этого можно избежать, если в цикле разбивать массив, но рекурсивно вызываться только от части, содержащей меньшее число элементов, а большую часть продолжать разбивать в цикле.
Асимптотика
Худшее время работы
Обозначим худшее время работы за . Получим рекуррентное соотношение
,где , так как мы разбиваемся на 2 подзадачи.
Предположим, что . Тогда получим
Заметим, что принимает максимальное значение на концах интервала [0; n-1], что позволяет нам сделать оценку
Подставим это в наше выражение для
Таким образом .
Среднее время работы
| Лемма: |
Пусть Х - полное количество сравнений элементов с опорным за время работы сортировки. Тогда время работы сортировки равно . |
| Доказательство: |
|
Нам необходимо вычислить полное количество сравнений. Переименуем элементы массива как , где наименьший по порядку элемент. Также введем множество . Заметим, что сравнеие каждой пары элементов происходит не больше одного раза, так как элемент сравнивается с опорным, а опорный элемент после разбиения больше не будет участвовать в сравнении. Поскольку каждая пара элементов срановается не более одного раза, полное количество сравнений выражается как , где если произошло сравнение и и , если сравнения не произошло. Применим к обоим частям равенства операцию вычисления матожидания и воспользовавшись ее линейностью получим сравнивается с Осталось вычислить величину сравнивается с - вероятность того, что сравнивается с . Поскольку предполагается, что все элементы в массиве различны, то при выборе в качестве опорного элемента впоследствии не будут сравниваться никакие и для которых . С другой стороны, если выбран в качестве опорного, то он будет сравниваться с каждым элементом кроме себя самого. Таким образом элементы и сравниваются тогда и только тогда когда первым в множестве опорным элементом был выбран один из них. сравнивается с первым опорным элементом был или первым опорным элементом был первым опорным элементом был |
Mатожидание времени работы быстрой сортировки будет .
Ссылки
http://ru.wikipedia.org/wiki/Быстрая_сортировка
http://en.wikipedia.org/wiki/Quicksort
Литература
- Т. Кормен, Ч. Лейзерсон, Р. Ривест: Алгоритмы: построение и анализ глава 7