Сортировка кучей — различия между версиями
Строка 26: | Строка 26: | ||
|[[Файл:Документ1.jpg|120px|right|thumb|Строим кучу]] | |[[Файл:Документ1.jpg|120px|right|thumb|Строим кучу]] | ||
|[[Файл:Документ2.jpg|120px|right|thumb|Первый проход]] | |[[Файл:Документ2.jpg|120px|right|thumb|Первый проход]] | ||
− | |[[Файл:Документ3.jpg|120px|right|thumb| | + | |[[Файл:Документ3.jpg|120px|right|thumb|Строим новую кучу]] |
|- | |- | ||
− | |[[Файл:Документ4.jpg|120px|right|thumb| | + | |[[Файл:Документ4.jpg|120px|right|thumb|Второй проход]] |
− | |[[Файл:Документ5.jpg|120px|right|thumb| | + | |[[Файл:Документ5.jpg|120px|right|thumb|Третий проход]] |
− | |[[Файл:Документ6.jpg|120px|right|thumb| | + | |[[Файл:Документ6.jpg|120px|right|thumb|Четвертый проход]] |
|} | |} | ||
Версия 22:47, 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