<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ftk</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ftk"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Ftk"/>
		<updated>2026-04-10T10:45:22Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BA%D1%83%D1%87%D0%B5%D0%B9&amp;diff=39265</id>
		<title>Сортировка кучей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BA%D1%83%D1%87%D0%B5%D0%B9&amp;diff=39265"/>
				<updated>2014-06-15T14:00:14Z</updated>
		
		<summary type="html">&lt;p&gt;Ftk: немного изменено описание, добавлена анимация с примером&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка кучей''', '''пирамидальная сортировка''' (англ. '''Heapsort''') {{---}} алгоритм сортировки, использующий структуру данных [[Двоичная куча|двоичная куча]]. Это неустойчивый алгоритм сортировки с временем работы &amp;lt;tex&amp;gt;O(n\log{n})&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки, и использующий &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; дополнительной памяти.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Необходимо отсортировать массив &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, размером &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Построим на базе этого массива за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; невозрастающую кучу. Так как по свойству кучи максимальный элемент находится в корне, то, поменявшись его местами с &amp;lt;tex&amp;gt;A[n - 1]&amp;lt;/tex&amp;gt;, он встанет на свое место. Далее вызовем процедуру &amp;lt;tex&amp;gt;sift\_down(0)&amp;lt;/tex&amp;gt;, предварительно уменьшив &amp;lt;tex&amp;gt;heap\_size&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Она за &amp;lt;tex&amp;gt;O(\log{n})&amp;lt;/tex&amp;gt; просеет &amp;lt;tex&amp;gt;A[0]&amp;lt;/tex&amp;gt; на нужное место и сформирует новую кучу (так как мы уменьшили ее размер, то куча располагается с &amp;lt;tex&amp;gt;A[0]&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;A[n - 2]&amp;lt;/tex&amp;gt;, а элемент &amp;lt;tex&amp;gt;A[n-1]&amp;lt;/tex&amp;gt; находится на своем месте). Повторим эту процедуру для новой кучи, только корень будет менять местами не с &amp;lt;tex&amp;gt;A[n - 1]&amp;lt;/tex&amp;gt;, а с &amp;lt;tex&amp;gt;A[n-2]&amp;lt;/tex&amp;gt;. Делая аналогичные действия, пока &amp;lt;tex&amp;gt;heap\_size&amp;lt;/tex&amp;gt; не станет равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, мы будем ставить наибольшее из оставшихся чисел в конец не отсортированной части. Очевидно, что таким образом, мы получим отсортированный массив.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} массив, который необходимо отсортировать; &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в нем; &amp;lt;tex&amp;gt;build\_heap(A)&amp;lt;/tex&amp;gt; - процедура, которая строит из передаваемого массива невозрастающую кучу в этом же массиве; &amp;lt;tex&amp;gt;sift\_down(A, i, len)&amp;lt;/tex&amp;gt; {{---}} процедура, которая просеивает вниз элемент &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; в куче из &amp;lt;tex&amp;gt;len&amp;lt;/tex&amp;gt; элементов, находящихся в начале массива &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
heapsort(A)&lt;br /&gt;
  build_heap(A);&lt;br /&gt;
  heap_size = A.size;&lt;br /&gt;
  for i = 0 to n - 2&lt;br /&gt;
    swap(A[0], A[n - 1 - i]);&lt;br /&gt;
    heap_size--;&lt;br /&gt;
    sift_down(A, 0, heap_size);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
Операция &amp;lt;tex&amp;gt;sift\_down&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(\log{n})&amp;lt;/tex&amp;gt;. Всего цикл выполняется &amp;lt;tex&amp;gt;(n - 1)&amp;lt;/tex&amp;gt; раз. Таким образом сложность сортировки кучей является &amp;lt;tex&amp;gt;O(n\log{n})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;right&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:heap1.png|155px|thumb|Строим кучу]]&lt;br /&gt;
 |[[Файл:heap2.png|155px|thumb|Первый проход]]&lt;br /&gt;
 |[[Файл:heap3.png|155px|thumb|Строим новую кучу]]&lt;br /&gt;
 |-&lt;br /&gt;
 |[[Файл:heap4.png|155px|thumb|Второй проход]]&lt;br /&gt;
 |[[Файл:heap5.png|155px|thumb|Третий проход]]&lt;br /&gt;
 |[[Файл:heap6.png|155px|thumb|Четвертый проход]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;3, 2, 4, 1, 5&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 3 4 1 2&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Строим кучу из исходного массива &lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''2''' 3 4 1 '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем местами первый и последний элементы &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''4''' 3 2 1 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Строим кучу из первых четырех элементов&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 3 2 '''4''' 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем местами первый и четвертый элементы &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''3''' 1 2 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Строим кучу из первых трех элементов&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''2''' 1 '''3''' 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем местами первый и третий элементы &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''2''' 1 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Строим кучу из двух элементов&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' '''2''' 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем местами первый и второй элементы  &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= JSort =&lt;br /&gt;
'''JSort''' является модификацией сортировки кучей, которую придумал Джейсон Моррисон (''Jason Morrison'').&lt;br /&gt;
Алгоритм частично упорядочивает массив, строя на нем два раза кучу: один раз передвигая меньшие элементы влево, второй раз передвигая большие элементы вправо.&lt;br /&gt;
Досортировав массив [[Сортировка вставками|сортировкой вставками]], можно получить временную сложность &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; в лучшем случае. &lt;br /&gt;
&lt;br /&gt;
=== Алгоритм ===&lt;br /&gt;
&lt;br /&gt;
Необходимо отсортировать массив.&lt;br /&gt;
Построим невозрастающую кучу на этом массиве. &lt;br /&gt;
Тогда наименьший элемент окажется на первой позиции, а левая часть массива окажется почти отсортированной, так как ей будут соответствовать верхние узлы кучи.&lt;br /&gt;
Теперь построим на этом же массиве кучу так, чтобы немного упорядочить правую часть массива. Эта куча должна быть неубывающей и быть &amp;quot;зеркальной&amp;quot; к массиву, то есть чтобы ее корень соответствовал последнему элементу массива.&lt;br /&gt;
Получившийся почти отсортированный массив досортируем сортировкой вставками.&lt;br /&gt;
&lt;br /&gt;
=== Сложность ===&lt;br /&gt;
&lt;br /&gt;
Постройка кучи занимает &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Сортировка вставками может отсортировать массив за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; в лучшем случае, и за &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt; в худшем.&lt;br /&gt;
&lt;br /&gt;
Таким образом временная сложность JSort является &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:JSort.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%80%D0%B0%D0%BC%D0%B8%D0%B4%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0 Пирамидальная сортировка - Википедия]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Heapsort Heapsort - Wikipedia]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/JSort JSort - Wikipedia]&lt;br /&gt;
*[http://habrahabr.ru/post/221095/ Описание сортировки кучей и JSort - Хабрахабр]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Ftk</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:JSort.gif&amp;diff=39264</id>
		<title>Файл:JSort.gif</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:JSort.gif&amp;diff=39264"/>
				<updated>2014-06-15T13:56:25Z</updated>
		
		<summary type="html">&lt;p&gt;Ftk: загружена новая версия «Файл:JSort.gif»: Демонстрация алгоритма сортировки JSort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Демонстрация алгоритма сортировки JSort&lt;/div&gt;</summary>
		<author><name>Ftk</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:JSort.gif&amp;diff=39263</id>
		<title>Файл:JSort.gif</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:JSort.gif&amp;diff=39263"/>
				<updated>2014-06-15T13:55:54Z</updated>
		
		<summary type="html">&lt;p&gt;Ftk: Демонстрация алгоритма сортировки JSort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Демонстрация алгоритма сортировки JSort&lt;/div&gt;</summary>
		<author><name>Ftk</name></author>	</entry>

	</feed>