Сортировка кучей — различия между версиями
Строка 5: | Строка 5: | ||
== Реализация == | == Реализация == | ||
− | <tex>A</tex> {{---}} массив, который необходимо отсортировать; <tex>n</tex> {{---}} количество элементов в нем; '''build_heap(A)''' - процедура, которая строит из передаваемого массива невозрастающую кучу в этом же массиве; '''sift_down(A, i, len)''' {{---}} процедура, которая просеивает вниз элемент <tex>A[i]</tex> в куче из | + | <tex>A</tex> {{---}} массив, который необходимо отсортировать; <tex>n</tex> {{---}} количество элементов в нем; '''build_heap(A)''' - процедура, которая строит из передаваемого массива невозрастающую кучу в этом же массиве; '''sift_down(A, i, len)''' {{---}} процедура, которая просеивает вниз элемент <tex>A[i]</tex> в куче из '''len''' элементов, находящихся в начале массива <tex>A</tex>. |
<pre> | <pre> | ||
heapsort(A) | heapsort(A) |
Версия 08:12, 3 июня 2012
Сортировка кучей, пирамидальная сортировка (англ. Heapsort) — алгоритм сортировки, использующий структуру данных двоичная куча. Это нестабильный алгоритм сортировки с временем работы , где — количество элементов для сортировки, и использующий дополнительной памяти.
Содержание
Алгоритм
Необходимо отсортировать массив
, размером . Построим на базе этого массива за невозрастающую кучу. Так как по свойству кучи максимальный элемент находится в корне, то, поменявшись его местами с , он встанет на свое место. Далее вызовем процедуру sift_down(0), предварительно уменьшив на . Она за просеет на нужное место и сформирует новую кучу (так как мы уменьшили ее размер, то куча располагается с по , а элемент находится на своем месте). Повторим эту процедуру для новой кучи, только корень будет менять местами не с , а с . Делая аналогичные действия, пока не станет равен , мы будем ставить наибольшее из оставшихся чисел в конец не отсортированной части. Очевидно, что таким образом, мы получим отсортированный массив.Реализация
— массив, который необходимо отсортировать; — количество элементов в нем; build_heap(A) - процедура, которая строит из передаваемого массива невозрастающую кучу в этом же массиве; sift_down(A, i, len) — процедура, которая просеивает вниз элемент в куче из 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 4 1 2 3 | Находим первый минимальный элемент — 1 | |
1 4 5 2 3 | Меняем минимальный и первый элементы местами | |
Второй проход (текущий массив начинается со следующего элемента) | ||
1 5 4 2 3 | Находим следующий минимальный элемент — 2 | |
1 2 4 5 3 | Меняем минимальный и второй элементы местами | |
Третий проход (текущий массив начинается со следующего элемента) | ||
1 2 4 5 3 | Находим следующий минимальный элемент — 3 | |
1 2 3 5 4 | Меняем минимальный и третий элементы местами | |
Четвертый проход (текущий массив начинается со следующего элемента) | ||
1 2 3 5 4 | Находим следующий минимальный элемент — 4 | |
1 2 3 4 5 | Меняем минимальный и четвертый элементы местами | |
1 2 3 4 5 | Массив отсортирован |
Ссылки
Литература
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4