Быстрая сортировка — различия между версиями
Строка 20: | Строка 20: | ||
<wikitex> | <wikitex> | ||
Partition(A, p, r) | Partition(A, p, r) | ||
− | x = A[ | + | x = A[q] |
i = p - 1 | i = p - 1 | ||
j = r + 1 | j = r + 1 | ||
while true | while true | ||
do repeat j = j - 1 | do repeat j = j - 1 | ||
− | until A[j] \ | + | until A[j] \leq x |
repeat i = i + 1 | repeat i = i + 1 | ||
until A[i] > x | until A[i] > x | ||
Строка 41: | Строка 41: | ||
Обозначим худшее время работы за <tex>T(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>, | + | <tex>T(n) = \max(T(q)+T(n-q-1))+\Theta(n)</tex>, где <tex>0 \leq q \leq n-1</tex>, |
так как мы разбиваемся на 2 подзадачи. | так как мы разбиваемся на 2 подзадачи. | ||
Строка 62: | Строка 62: | ||
{{ | {{ | ||
Лемма | Лемма | ||
− | |statement=Пусть Х - полное количество сравнений элементов с опорным за время работы сортировки. Тогда время работы сортировки равно <tex>O(n \log n)</tex>. | + | |statement=Пусть Х {{---}} полное количество сравнений элементов с опорным за время работы сортировки. Тогда время работы сортировки равно <tex>O(n \log n)</tex>. |
|proof=Нам необходимо вычислить полное количество сравнений. | |proof=Нам необходимо вычислить полное количество сравнений. | ||
Переименуем элементы массива как <tex>z_1...z_n</tex>, где <tex>z_i</tex> наименьший по порядку элемент. | Переименуем элементы массива как <tex>z_1...z_n</tex>, где <tex>z_i</tex> наименьший по порядку элемент. |
Версия 18:14, 29 мая 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[q] i = p - 1 j = r + 1 while true do repeat j = j - 1 until A[j] \leq 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