Сортировка кучей — различия между версиями
(его -> массив) |
Ftk (обсуждение | вклад) (немного изменено описание, добавлена анимация с примером) |
||
Строка 78: | Строка 78: | ||
= JSort = | = JSort = | ||
'''JSort''' является модификацией сортировки кучей, которую придумал Джейсон Моррисон (''Jason Morrison''). | '''JSort''' является модификацией сортировки кучей, которую придумал Джейсон Моррисон (''Jason Morrison''). | ||
− | + | Алгоритм частично упорядочивает массив, строя на нем два раза кучу: один раз передвигая меньшие элементы влево, второй раз передвигая большие элементы вправо. | |
Досортировав массив [[Сортировка вставками|сортировкой вставками]], можно получить временную сложность <tex>O(n)</tex> в лучшем случае. | Досортировав массив [[Сортировка вставками|сортировкой вставками]], можно получить временную сложность <tex>O(n)</tex> в лучшем случае. | ||
Строка 87: | Строка 87: | ||
Тогда наименьший элемент окажется на первой позиции, а левая часть массива окажется почти отсортированной, так как ей будут соответствовать верхние узлы кучи. | Тогда наименьший элемент окажется на первой позиции, а левая часть массива окажется почти отсортированной, так как ей будут соответствовать верхние узлы кучи. | ||
Теперь построим на этом же массиве кучу так, чтобы немного упорядочить правую часть массива. Эта куча должна быть неубывающей и быть "зеркальной" к массиву, то есть чтобы ее корень соответствовал последнему элементу массива. | Теперь построим на этом же массиве кучу так, чтобы немного упорядочить правую часть массива. Эта куча должна быть неубывающей и быть "зеркальной" к массиву, то есть чтобы ее корень соответствовал последнему элементу массива. | ||
− | Получившийся почти | + | Получившийся почти отсортированный массив досортируем сортировкой вставками. |
=== Сложность === | === Сложность === | ||
Строка 96: | Строка 96: | ||
Таким образом временная сложность JSort является <tex>O(n^2)</tex>. | Таким образом временная сложность JSort является <tex>O(n^2)</tex>. | ||
+ | === Пример === | ||
+ | |||
+ | [[Файл:JSort.gif]] | ||
== Ссылки == | == Ссылки == |
Версия 17:00, 15 июня 2014
Сортировка кучей, пирамидальная сортировка (англ. Heapsort) — алгоритм сортировки, использующий структуру данных двоичная куча. Это неустойчивый алгоритм сортировки с временем работы , где — количество элементов для сортировки, и использующий дополнительной памяти.
Содержание
Алгоритм
Необходимо отсортировать массив
, размером . Построим на базе этого массива за невозрастающую кучу. Так как по свойству кучи максимальный элемент находится в корне, то, поменявшись его местами с , он встанет на свое место. Далее вызовем процедуру , предварительно уменьшив на . Она за просеет на нужное место и сформирует новую кучу (так как мы уменьшили ее размер, то куча располагается с по , а элемент находится на своем месте). Повторим эту процедуру для новой кучи, только корень будет менять местами не с , а с . Делая аналогичные действия, пока не станет равен , мы будем ставить наибольшее из оставшихся чисел в конец не отсортированной части. Очевидно, что таким образом, мы получим отсортированный массив.Реализация
— массив, который необходимо отсортировать; — количество элементов в нем; - процедура, которая строит из передаваемого массива невозрастающую кучу в этом же массиве; — процедура, которая просеивает вниз элемент в куче из элементов, находящихся в начале массива .
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);
Сложность
Операция
работает за . Всего цикл выполняется раз. Таким образом сложность сортировки кучей является .
Пример
Пусть дана последовательность из
элементов .Массив | Описание шага | |
---|---|---|
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 | Массив отсортирован |
JSort
JSort является модификацией сортировки кучей, которую придумал Джейсон Моррисон (Jason Morrison). Алгоритм частично упорядочивает массив, строя на нем два раза кучу: один раз передвигая меньшие элементы влево, второй раз передвигая большие элементы вправо. Досортировав массив сортировкой вставками, можно получить временную сложность в лучшем случае.
Алгоритм
Необходимо отсортировать массив. Построим невозрастающую кучу на этом массиве. Тогда наименьший элемент окажется на первой позиции, а левая часть массива окажется почти отсортированной, так как ей будут соответствовать верхние узлы кучи. Теперь построим на этом же массиве кучу так, чтобы немного упорядочить правую часть массива. Эта куча должна быть неубывающей и быть "зеркальной" к массиву, то есть чтобы ее корень соответствовал последнему элементу массива. Получившийся почти отсортированный массив досортируем сортировкой вставками.
Сложность
Постройка кучи занимает
. Сортировка вставками может отсортировать массив за в лучшем случае, и за в худшем.Таким образом временная сложность JSort является
.Пример
Ссылки
- Пирамидальная сортировка - Википедия
- Heapsort - Wikipedia
- JSort - Wikipedia
- Описание сортировки кучей и JSort - Хабрахабр
Литература
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4