Сортировка кучей — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «'''Сортировка кучей''', '''пирамидальная сортировка''' (англ. '''Heapsort''') {{---}} алгоритм сортиров...»)
 
Строка 1: Строка 1:
'''Сортировка кучей''', '''пирамидальная сортировка''' (англ. '''Heapsort''') {{---}} алгоритм сортировки, использующий структуру данных [[Двоичная куча|двоичная куча]], который был пред­ло­же­н Дж. Уи­льям­сом в 1964 го­ду. Это нестабильный алгоритм сортировки с гарантированным временем работы <tex>\Theta(n\log{n})</tex> , где <tex>n</tex> {{---}} количество элементов для сортировки, и использующий <tex>O(1)</tex> дополнительной памяти.
+
'''Сортировка кучей''', '''пирамидальная сортировка''' (англ. '''Heapsort''') {{---}} алгоритм сортировки, использующий структуру данных [[Двоичная куча|двоичная куча]]. Это нестабильный алгоритм сортировки с гарантированным временем работы <tex>\Theta(n\log{n})</tex> , где <tex>n</tex> {{---}} количество элементов для сортировки, и использующий <tex>O(1)</tex> дополнительной памяти.
  
 
== Алгоритм ==
 
== Алгоритм ==

Версия 07:25, 3 июня 2012

Сортировка кучей, пирамидальная сортировка (англ. Heapsort) — алгоритм сортировки, использующий структуру данных двоичная куча. Это нестабильный алгоритм сортировки с гарантированным временем работы [math]\Theta(n\log{n})[/math] , где [math]n[/math] — количество элементов для сортировки, и использующий [math]O(1)[/math] дополнительной памяти.

Алгоритм

Необходимо отсортировать массив [math]A[/math], размером [math]n[/math]. Построим на базе этого массива за [math]O(n)[/math] невозрастающую кучу. Так как по свойству кучи максимальный элемент находится в корне, то, поменявшись его местами с [math]A[n - 1][/math], он встанет на свое место. Далее вызовем процедуру sift_down(0), предварительно уменьшив [math]heap\_size[/math] на [math]1[/math]. Она за [math]O(\log{n})[/math] просеет [math]A[0][/math] на нужное место и сформирует новую кучу (так как мы уменьшили ее размер, то куча располагается с [math]A[0][/math] по [math]A[n - 2][/math], а элемент [math]A[n-1][/math] находится на своем месте). Повторим эту процедуру для новой кучи, только корень будет менять местами не с [math]A[n - 1][/math], а с [math]A[n-2][/math]. Проделав аналогичные операции [math]n - 1[/math], мы получим отсортированный массив.

Реализация

 // Входной массив x, содержащий n элементов.
 for i = 0 to n - 1
    min = i;
       for j = i + 1 to n - 1
          if x[j] < x[min]
             min = j;
    swap(x[i], x[min]);
 // Массив x отсортирован

Пример

Пусть дана последовательность из [math]5[/math] элементов [math]5, 4, 1, 2, 3[/math].

Массив Описание шага
Первый проход (текущий массив начинается с первого элемента)
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