Сортировка кучей — различия между версиями
Строка 21: | Строка 21: | ||
== Пример == | == Пример == | ||
− | |||
+ | {|align="right" | ||
+ | |-valign="top" | ||
+ | |[[Файл:Документ1.jpg|120px|right|thumb|Строим кучу]] | ||
+ | |[[Файл:Документ2.jpg|120px|right|thumb|Первый проход]] | ||
+ | |[[Файл:Документ3.jpg|120px|right|thumb|Второй проход]] | ||
+ | |- | ||
+ | |[[Файл:Документ4.jpg|120px|right|thumb|Четвертый проход]] | ||
+ | |[[Файл:Документ5.jpg|120px|right|thumb|Пятый проход]] | ||
+ | |[[Файл:Документ6.jpg|120px|right|thumb|Массив отсортирован]] | ||
+ | |} | ||
− | Пусть дана последовательность из <tex>5</tex> элементов <tex> | + | Пусть дана последовательность из <tex>5</tex> элементов <tex>3, 2, 4, 1, 5</tex>. |
{| style="background-color:#CCC;margin:0.5px" | {| style="background-color:#CCC;margin:0.5px" | ||
Строка 30: | Строка 39: | ||
!style="background-color:#EEE"| Описание шага | !style="background-color:#EEE"| Описание шага | ||
|- | |- | ||
− | | | + | |style="background-color:#FFF;padding:2px 10px"| 5 3 4 1 2 |
+ | |style="background-color:#FFF;padding:2px 10px"| Строим кучу из исходного массива | ||
|- | |- | ||
− | | | + | |colspan=3|''Первый проход'' |
− | | | ||
|- | |- | ||
− | |style="background-color:#FFF;padding:2px 10px"| ''' | + | |style="background-color:#FFF;padding:2px 10px"| '''2''' 3 4 1 '''5''' |
− | |style="background-color:#FFF;padding:2px 10px"| Меняем | + | |style="background-color:#FFF;padding:2px 10px"| Меняем местами первый и последний элементы |
|- | |- | ||
− | | | + | |style="background-color:#FFF;padding:2px 10px"| '''4''' 3 2 1 5 |
+ | |style="background-color:#FFF;padding:2px 10px"| Строим кучу из первых четырех элементов | ||
|- | |- | ||
− | | | + | |colspan=3|''Второй проход'' |
− | | | ||
|- | |- | ||
− | |style="background-color:#FFF;padding:2px 10px"| 1 '''2''' 4 '''5 | + | |style="background-color:#FFF;padding:2px 10px"| '''1''' 3 2 '''4''' 5 |
− | |style="background-color:#FFF;padding:2px 10px"| Меняем | + | |style="background-color:#FFF;padding:2px 10px"| Меняем местами первый и четвертый элементы |
|- | |- | ||
− | | | + | |style="background-color:#FFF;padding:2px 10px"| '''3''' 1 2 4 5 |
+ | |style="background-color:#FFF;padding:2px 10px"| Строим кучу из первых трех элементов | ||
|- | |- | ||
− | | | + | |colspan=3|''Третий проход'' |
− | |||
|- | |- | ||
− | |style="background-color:#FFF;padding:2px 10px"| | + | |style="background-color:#FFF;padding:2px 10px"| '''2''' 1 '''3''' 4 5 |
− | |style="background-color:#FFF;padding:2px 10px"| Меняем | + | |style="background-color:#FFF;padding:2px 10px"| Меняем местами первый и третий элементы |
|- | |- | ||
− | | | + | |style="background-color:#FFF;padding:2px 10px"| '''2''' 1 3 4 5 |
+ | |style="background-color:#FFF;padding:2px 10px"| Строим кучу из двух элементов | ||
|- | |- | ||
− | | | + | |colspan=3|''Четвертый проход'' |
− | | | ||
|- | |- | ||
− | |style="background-color:#FFF;padding:2px 10px"| | + | |style="background-color:#FFF;padding:2px 10px"| '''1''' '''2''' 3 4 5 |
− | |style="background-color:#FFF;padding:2px 10px"| Меняем | + | |style="background-color:#FFF;padding:2px 10px"| Меняем местами первый и второй элементы |
|- | |- | ||
|style="background-color:#FFF;padding:2px 10px"| 1 2 3 4 5 | |style="background-color:#FFF;padding:2px 10px"| 1 2 3 4 5 |
Версия 22:44, 3 июня 2012
Сортировка кучей, пирамидальная сортировка (англ. Heapsort) — алгоритм сортировки, использующий структуру данных двоичная куча. Это нестабильный алгоритм сортировки с временем работы , где — количество элементов для сортировки, и использующий дополнительной памяти.
Содержание
Алгоритм
Необходимо отсортировать массив
, размером . Построим на базе этого массива за невозрастающую кучу. Так как по свойству кучи максимальный элемент находится в корне, то, поменявшись его местами с , он встанет на свое место. Далее вызовем процедуру sift_down(0), предварительно уменьшив на . Она за просеет на нужное место и сформирует новую кучу (так как мы уменьшили ее размер, то куча располагается с по , а элемент находится на своем месте). Повторим эту процедуру для новой кучи, только корень будет менять местами не с , а с . Делая аналогичные действия, пока не станет равен , мы будем ставить наибольшее из оставшихся чисел в конец не отсортированной части. Очевидно, что таким образом, мы получим отсортированный массив.Реализация
— массив, который необходимо отсортировать; — количество элементов в нем; build_heap(A) - процедура, которая строит из передаваемого массива невозрастающую кучу в этом же массиве; sift_down(A, i, len) — процедура, которая просеивает вниз элемент в куче из элементов, находящихся в начале массива .
heapsort(A) build_heap(A); heap_size = A.size; for i = 0 to n - 2 swap(A[0], A[n - 1 - i]); heap_size--; sift_down(A, 0, heap_size);
Сложность
Операция sift_down работает за
. Всего цикл выполняется раз. Таким образом сложность сортировки кучей является .
Пример
Пусть дана последовательность из
элементов .Массив | Описание шага | |
---|---|---|
5 3 4 1 2 | Строим кучу из исходного массива | |
Первый проход | ||
2 3 4 1 5 | Меняем местами первый и последний элементы | |
4 3 2 1 5 | Строим кучу из первых четырех элементов | |
Второй проход | ||
1 3 2 4 5 | Меняем местами первый и четвертый элементы | |
3 1 2 4 5 | Строим кучу из первых трех элементов | |
Третий проход | ||
2 1 3 4 5 | Меняем местами первый и третий элементы | |
2 1 3 4 5 | Строим кучу из двух элементов | |
Четвертый проход | ||
1 2 3 4 5 | Меняем местами первый и второй элементы | |
1 2 3 4 5 | Массив отсортирован |
Ссылки
Литература
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4