<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://apmath.info/w/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8</id>
	<title>Сортировка вставками - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://apmath.info/w/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8"/>
	<link rel="alternate" type="text/html" href="https://apmath.info/w/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;action=history"/>
	<updated>2026-11-03T19:12:01Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>https://apmath.info/w/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=743&amp;oldid=prev</id>
		<title>СВ: /* Связанные темы */</title>
		<link rel="alternate" type="text/html" href="https://apmath.info/w/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=743&amp;oldid=prev"/>
		<updated>2026-10-27T22:13:59Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Связанные темы&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 22:13, 27 октября 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l353&quot;&gt;Строка 353:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 353:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Связанные темы ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Связанные темы ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Сортировки]] &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(план) &lt;/del&gt;— обзор алгоритмов и нижняя граница &amp;lt;math&amp;gt;\Omega(n\log n)&amp;lt;/math&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Сортировки]] — обзор алгоритмов и нижняя граница &amp;lt;math&amp;gt;\Omega(n\log n)&amp;lt;/math&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Сортировка Шелла]] &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(план) &lt;/del&gt;— обобщение вставок на убывающие шаги.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Сортировка Шелла]] — обобщение вставок на убывающие шаги.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Сортировка пузырьком]] — обменный родственник; вставки почти всегда его быстрее.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Сортировка пузырьком]] — обменный родственник; вставки почти всегда его быстрее.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Быстрая сортировка]] &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(план) &lt;/del&gt;— introsort и переключение на вставки.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Быстрая сортировка]] — introsort и переключение на вставки.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Сортировка слиянием]] &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(план) &lt;/del&gt;— гибрид с вставками на малых отрезках.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Сортировка слиянием]] — гибрид с вставками на малых отрезках.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Timsort]] &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(план) &lt;/del&gt;— бинарные вставки для удлинения runs (minrun).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Timsort]] — бинарные вставки для удлинения runs (minrun).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Пирамидальная сортировка]] &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(план) &lt;/del&gt;— другой &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;-по-памяти алгоритм.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Пирамидальная сортировка]] — другой &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;-по-памяти алгоритм.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Асимптотическая сложность]] &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(план) &lt;/del&gt;— лучший/средний/худший случаи.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Асимптотическая сложность]] — лучший/средний/худший случаи.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Источники ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Источники ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key apmath_info_db-w:diff::1.12:old-726:rev-743 --&gt;
&lt;/table&gt;</summary>
		<author><name>СВ</name></author>
	</entry>
	<entry>
		<id>https://apmath.info/w/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=726&amp;oldid=prev</id>
		<title>СВ в 15:40, 26 октября 2026</title>
		<link rel="alternate" type="text/html" href="https://apmath.info/w/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=726&amp;oldid=prev"/>
		<updated>2026-10-26T15:40:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://apmath.info/w/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;amp;diff=726&amp;amp;oldid=277&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>СВ</name></author>
	</entry>
	<entry>
		<id>https://apmath.info/w/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=277&amp;oldid=prev</id>
		<title>СВ: Новая страница: «== TL;DR ==  '''Сортировка вставками''' (insertion sort) поддерживает '''отсортированный префикс''' масс...»</title>
		<link rel="alternate" type="text/html" href="https://apmath.info/w/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=277&amp;oldid=prev"/>
		<updated>2026-09-30T19:21:06Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «== TL;DR ==  &amp;#039;&amp;#039;&amp;#039;Сортировка вставками&amp;#039;&amp;#039;&amp;#039; (insertion sort) поддерживает &amp;#039;&amp;#039;&amp;#039;отсортированный префикс&amp;#039;&amp;#039;&amp;#039; масс...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== TL;DR ==&lt;br /&gt;
&lt;br /&gt;
'''Сортировка вставками''' (insertion sort) поддерживает '''отсортированный префикс''' массива и на каждом шаге вставляет в него очередной элемент, сдвигая бо́льшие элементы вправо. Алгоритм прост, работает '''на месте''' (&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; памяти), '''устойчив''' и '''адаптивен''': почти отсортированный массив сортируется за &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. В худшем (обратный массив) и среднем случаях — &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;. Точная стоимость — &amp;lt;math&amp;gt;\Theta(n + \text{inv})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\text{inv}&amp;lt;/math&amp;gt; — число '''инверсий''': каждый сдвиг устраняет ровно одну инверсию. '''Бинарная''' версия ищет позицию двоичным поиском (&amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; сравнений), но сдвиги остаются &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Благодаря простоте и дешевизне на малых отрезках вставки служат '''базой гибридных сортировок''' — [[Быстрая сортировка\|introsort]], [[Сортировка слиянием\|mergesort]], [[Timsort\|Timsort]] (minrun) — переключаются на них при &amp;lt;math&amp;gt;n &amp;lt; 16\ldots32&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Свойство !! Значение&lt;br /&gt;
|-&lt;br /&gt;
| Класс || Сортировка сравнением; на месте; устойчивая; онлайн&lt;br /&gt;
|-&lt;br /&gt;
| Лучший случай || &amp;lt;math&amp;gt;\Theta(n)&amp;lt;/math&amp;gt; (уже отсортирован)&lt;br /&gt;
|-&lt;br /&gt;
| Средний случай || &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt; (~&amp;lt;math&amp;gt;n^2/4&amp;lt;/math&amp;gt; сравнений)&lt;br /&gt;
|-&lt;br /&gt;
| Худший случай || &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;n(n-1)/2&amp;lt;/math&amp;gt; сравнений)&lt;br /&gt;
|-&lt;br /&gt;
| Перемещений || &amp;lt;math&amp;gt;\Theta(n + \text{inv})&amp;lt;/math&amp;gt; (inv — число инверсий)&lt;br /&gt;
|-&lt;br /&gt;
| Память || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Устойчивость || да (строгое «&amp;gt;» при сдвиге)&lt;br /&gt;
|-&lt;br /&gt;
| Адаптивность || высокая (&amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; на почти отсортированных)&lt;br /&gt;
|-&lt;br /&gt;
| Бинарная версия || &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; сравнений, но &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; перемещений&lt;br /&gt;
|-&lt;br /&gt;
| Роль || база гибридов; малые массивы; Shellsort&lt;br /&gt;
|-&lt;br /&gt;
| Родственники || [[Сортировки|обзор сортировок]], [[Timsort]], [[Сортировка слиянием]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Определения ==&lt;br /&gt;
&lt;br /&gt;
'''Сортировка вставками''' — алгоритм, который поочерёдно (слева направо) вставляет элемент &amp;lt;math&amp;gt;a[i]&amp;lt;/math&amp;gt; в уже отсортированный отрезок &amp;lt;math&amp;gt;a[0..i-1]&amp;lt;/math&amp;gt;, сдвигая элементы, большие &amp;lt;math&amp;gt;a[i]&amp;lt;/math&amp;gt;, на одну позицию вправо, и кладёт &amp;lt;math&amp;gt;a[i]&amp;lt;/math&amp;gt; на освободившееся место.&lt;br /&gt;
&lt;br /&gt;
'''Отсортированный префикс''' — отрезок &amp;lt;math&amp;gt;a[0..i-1]&amp;lt;/math&amp;gt;, который поддерживается неубывающим на каждом шаге. Полное отсортирование достигается при &amp;lt;math&amp;gt;i = n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Устойчивость (stability)''' — равные элементы сохраняют исходный порядок. Вставки устойчивы, потому что сдвигаются только элементы, '''строго большие''' вставляемого.&lt;br /&gt;
&lt;br /&gt;
'''На месте (in-place)''' — используется &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; дополнительной памяти (одна переменная под вставляемый элемент).&lt;br /&gt;
&lt;br /&gt;
'''Онлайн-алгоритм''' — может сортировать данные по мере их поступления, имея отсортированными уже прочитанные элементы.&lt;br /&gt;
&lt;br /&gt;
'''Инверсия''' — пара индексов &amp;lt;math&amp;gt;i &amp;lt; j&amp;lt;/math&amp;gt; с &amp;lt;math&amp;gt;a[i] &amp;gt; a[j]&amp;lt;/math&amp;gt;; мера «беспорядка». В сортировке вставками каждый сдвиг устраняет ровно одну инверсию.&lt;br /&gt;
&lt;br /&gt;
'''Бинарная сортировка вставками''' — вариант, в котором позиция вставки ищется '''двоичным поиском''' за &amp;lt;math&amp;gt;O(\log i)&amp;lt;/math&amp;gt;, но перемещение элементов всё равно выполняется сдвигом.&lt;br /&gt;
&lt;br /&gt;
'''Shellsort''' — обобщение: сортировка вставками по подпоследовательностям с убывающими шагами; элементы перемещаются на большие расстояния, что ускоряет последующие проходы.&lt;br /&gt;
&lt;br /&gt;
'''Обозначения.''' &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — длина массива; &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — текущий индекс; &amp;lt;math&amp;gt;\text{inv}&amp;lt;/math&amp;gt; — число инверсий; &amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt; — двоичный.&lt;br /&gt;
&lt;br /&gt;
== Мотивация и интуиция ==&lt;br /&gt;
&lt;br /&gt;
Сортировка вставками — вероятно, '''простейший''' алгоритм сортировки, и у него есть три свойства, делающие его незаменимым на практике: '''на месте''', '''устойчив''' и '''адаптивен'''. На массиве, где беспорядка мало (почти отсортированном, или «немного подправленном»), она обгоняет и quicksort, и mergesort, потому что делает работу, пропорциональную числу инверсий.&lt;br /&gt;
&lt;br /&gt;
Идея в одном абзаце: '''держим префикс отсортированным'''. Вставляя &amp;lt;math&amp;gt;a[i]&amp;lt;/math&amp;gt;, достаточно раздвинуть часть префикса, чтобы найти место; чем меньше инверсий у &amp;lt;math&amp;gt;a[i]&amp;lt;/math&amp;gt;, тем меньше сдвигов. В пределе (массив уже отсортирован) каждый элемент вставляется на своё место за одно сравнение — суммарно &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Именно поэтому вставки используют как '''«хвост»''' рекурсивных сортировок: на коротких отрезках рекурсия и накладные расходы дороже, чем прямая вставка; а почти отсортированные данные — частая реальность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:iv-01-idea.svg|frame|none|700px|Рис. 1. Вставляем элемент в отсортированный префикс, сдвигая большие элементы вправо.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:iv-02-inversions.svg|frame|none|700px|Рис. 2. Сдвигов ровно столько, сколько инверсий: отсортированное — &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, обратное — &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
== Устройство ==&lt;br /&gt;
&lt;br /&gt;
Два «указателя»: граница отсортированного префикса &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и позиция &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; внутри префикса, идущая справа налево в поиске места. Вставляемый элемент сохраняется в переменной (это и есть дополнительная «память» &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;), затем сдвигаются элементы.&lt;br /&gt;
&lt;br /&gt;
* '''Массив.''' Сдвиг — это запись элементов на соседние позиции (&amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; в худшем); вставка дешёва по количеству обменов, но перемещения памяти могут быть дорогими.&lt;br /&gt;
* '''Связный список.''' Сдвиг заменяется обновлением указателей; но поиск места остаётся линейным, поэтому общая сложность всё равно &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; (см. рис. 5).&lt;br /&gt;
&lt;br /&gt;
[[Файл:iv-03-trace.svg|frame|none|700px|Рис. 3. Массив после каждого шага: префикс слева растёт и остаётся отсортированным.]]&lt;br /&gt;
&lt;br /&gt;
== Операции и алгоритмы ==&lt;br /&gt;
&lt;br /&gt;
=== Операция: Insertion-Sort (линейный поиск места) ===&lt;br /&gt;
&lt;br /&gt;
'''Идея.''' Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; «протаскиваем» &amp;lt;math&amp;gt;a[i]&amp;lt;/math&amp;gt; влево, пока предыдущий элемент больше.&lt;br /&gt;
&lt;br /&gt;
'''Пошаговое описание:'''&lt;br /&gt;
&lt;br /&gt;
# Для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;: сохранить &amp;lt;code&amp;gt;v ← a[i]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;j ← i-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Пока &amp;lt;code&amp;gt;j ≥ 0&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;a[j] &amp;amp;gt; v&amp;lt;/code&amp;gt;: сдвинуть &amp;lt;code&amp;gt;a[j]&amp;lt;/code&amp;gt; вправо (&amp;lt;code&amp;gt;a[j+1] ← a[j]&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;j ← j-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Положить &amp;lt;code&amp;gt;a[j+1] ← v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Инвариант.''' Перед обработкой &amp;lt;math&amp;gt;a[i]&amp;lt;/math&amp;gt; отрезок &amp;lt;math&amp;gt;a[0..i-1]&amp;lt;/math&amp;gt; отсортирован; элементы &amp;lt;math&amp;gt;a[i..n-1]&amp;lt;/math&amp;gt; ещё не тронуты.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Алгоритм Insertion-Sort(a)&lt;br /&gt;
Вход:  массив a[0..n−1]&lt;br /&gt;
Выход: a отсортирован по неубыванию&lt;br /&gt;
Инвариант: перед шагом i отрезок a[0..i−1] отсортирован&lt;br /&gt;
Сложность: O(n + inv) перемещений; сравнений от n−1 (лучший) до n(n−1)/2 (худший)&lt;br /&gt;
&lt;br /&gt;
1  for i ← 1 to n − 1&lt;br /&gt;
2      v ← a[i]&lt;br /&gt;
3      j ← i − 1&lt;br /&gt;
4      while j ≥ 0 and a[j] &amp;gt; v          # строгое &amp;gt; → устойчивость&lt;br /&gt;
5          a[j + 1] ← a[j]&lt;br /&gt;
6          j ← j − 1&lt;br /&gt;
7      a[j + 1] ← v&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Разбор.''' &amp;lt;code&amp;gt;[5,2,4,6,1,3]&amp;lt;/code&amp;gt; (см. рис. 3): после шагов получаем &amp;lt;code&amp;gt;[2,4,5,6|1,3]&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;[1,2,4,5,6|3]&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;[1,2,3,4,5,6]&amp;lt;/code&amp;gt;; всего 9 сдвигов = число инверсий.&lt;br /&gt;
&lt;br /&gt;
'''Сложность.''' Лучший &amp;lt;math&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;, средний &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;, худший &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;; память &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Крайние случаи.''' Отсортированный массив — &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сравнение и 0 сдвигов. Обратный — &amp;lt;math&amp;gt;n(n-1)/2&amp;lt;/math&amp;gt; сравнений и сдвигов. &amp;lt;math&amp;gt;n \le 1&amp;lt;/math&amp;gt; — ничего.&lt;br /&gt;
&lt;br /&gt;
=== Операция: Binary-Insertion-Sort ===&lt;br /&gt;
&lt;br /&gt;
'''Идея.''' Позицию вставки искать двоичным поиском в отсортированном префиксе (см. рис. 4).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Алгоритм Binary-Insertion-Sort(a)&lt;br /&gt;
Вход:  массив a[0..n−1]&lt;br /&gt;
Выход: a отсортирован&lt;br /&gt;
Сложность: O(n log n) сравнений, но O(n²) перемещений ⇒ O(n²) времени&lt;br /&gt;
&lt;br /&gt;
1  for i ← 1 to n − 1&lt;br /&gt;
2      v ← a[i]&lt;br /&gt;
3      lo ← 0 ; hi ← i                    # верхняя граница: первый p, где v &amp;lt; a[p]&lt;br /&gt;
4      while lo &amp;lt; hi&lt;br /&gt;
5          mid ← lo + ⌊(hi − lo) / 2⌋&lt;br /&gt;
6          if v &amp;lt; a[mid]: hi ← mid else lo ← mid + 1&lt;br /&gt;
7      for j ← i downto lo + 1&lt;br /&gt;
8          a[j] ← a[j − 1]               # сдвиг&lt;br /&gt;
9      a[lo] ← v&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Разбор.''' На рис. 4 для &amp;lt;code&amp;gt;v = 4&amp;lt;/code&amp;gt; позиция находится за 2–3 сравнения вместо 3–4.&lt;br /&gt;
&lt;br /&gt;
'''Сложность.''' Сравнений &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt;; перемещений по-прежнему &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; → суммарно &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Крайние случаи.''' Двоичный поиск ищет '''верхнюю''' границу — равные не переставляются, код устойчив.&lt;br /&gt;
&lt;br /&gt;
[[Файл:iv-04-binary.svg|frame|none|700px|Рис. 4. Меньше сравнений, но сдвиги те же: &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; по перемещениям сохраняется.]]&lt;br /&gt;
&lt;br /&gt;
=== Операция: сортировка вставками на списке ===&lt;br /&gt;
&lt;br /&gt;
'''Идея.''' Идём по списку; каждый очередной узел вставляем в отсортированную часть, меняя указатели.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Алгоритм List-Insertion-Sort(head)&lt;br /&gt;
Вход:  односвязный список&lt;br /&gt;
Выход: отсортированный список&lt;br /&gt;
Сложность: O(n²) сравнений; перемещений — O(1) на вставку&lt;br /&gt;
&lt;br /&gt;
1  sorted ← NIL&lt;br /&gt;
2  for each узел cur в исходном порядке&lt;br /&gt;
3      next ← cur.next&lt;br /&gt;
4      вставить cur в sorted на нужное место (линейный поиск)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Крайние случаи.''' Вставка в начало; дубликаты (вставляем после равных — устойчиво).&lt;br /&gt;
&lt;br /&gt;
[[Файл:iv-05-linkedlist.svg|frame|none|700px|Рис. 5. На списке вставка — обновление указателей, но поиск места линейный.]]&lt;br /&gt;
&lt;br /&gt;
== Сводная таблица сложности ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Операция !! Лучший !! Средний !! Худший !! Память&lt;br /&gt;
|-&lt;br /&gt;
| Сравнения || &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;\approx n^2/4&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;n(n-1)/2&amp;lt;/math&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перемещения (сдвиги) || &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;\approx n^2/4&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;n(n-1)/2&amp;lt;/math&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Всего || &amp;lt;math&amp;gt;\Theta(n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary-Insertion: сравнения || &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary-Insertion: перемещения || &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Точная формула || — || — || &amp;lt;math&amp;gt;\Theta(n + \text{inv})&amp;lt;/math&amp;gt; || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оговорка: точная оценка &amp;lt;math&amp;gt;\Theta(n+\text{inv})&amp;lt;/math&amp;gt; показывает '''адаптивность''': при малом числе инверсий вставки линейны и обгоняют «быстрые» сортировки. На списке обменов &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;, но сравнений &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Трассировка примера ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;a = [5, 2, 4, 6, 1, 3]&amp;lt;/code&amp;gt; (см. рис. 3).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; !! Вставляем !! Действие !! Массив !! Сдвиги&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || 2 перед 5 || &amp;lt;code&amp;gt;[2, 5, 4, 6, 1, 3]&amp;lt;/code&amp;gt; || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || между 2 и 5 || &amp;lt;code&amp;gt;[2, 4, 5, 6, 1, 3]&amp;lt;/code&amp;gt; || 1&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 6 || на месте || &amp;lt;code&amp;gt;[2, 4, 5, 6, 1, 3]&amp;lt;/code&amp;gt; || 0&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || в начало || &amp;lt;code&amp;gt;[1, 2, 4, 5, 6, 3]&amp;lt;/code&amp;gt; || 4&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 3 || между 2 и 4 || &amp;lt;code&amp;gt;[1, 2, 3, 4, 5, 6]&amp;lt;/code&amp;gt; || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Всего сдвигов: &amp;lt;math&amp;gt;1+1+0+4+3 = 9&amp;lt;/math&amp;gt; — ровно число инверсий массива &amp;lt;code&amp;gt;[5,2,4,6,1,3]&amp;lt;/code&amp;gt;. Трассировка сверена с реализацией из раздела «Служебное».&lt;br /&gt;
&lt;br /&gt;
== Корректность и оценка сложности ==&lt;br /&gt;
&lt;br /&gt;
=== Корректность (инвариант) ===&lt;br /&gt;
&lt;br /&gt;
'''Инвариант цикла.''' Перед обработкой &amp;lt;math&amp;gt;a[i]&amp;lt;/math&amp;gt; массив &amp;lt;math&amp;gt;a[0..i-1]&amp;lt;/math&amp;gt; отсортирован; элементы &amp;lt;math&amp;gt;a[i..n-1]&amp;lt;/math&amp;gt; не тронуты.&lt;br /&gt;
&lt;br /&gt;
'''База.''' &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt;: префикс из одного элемента &amp;lt;math&amp;gt;a[0]&amp;lt;/math&amp;gt; отсортирован.&lt;br /&gt;
&lt;br /&gt;
'''Сохранение.''' При вставке &amp;lt;math&amp;gt;v = a[i]&amp;lt;/math&amp;gt; мы находим первую справа позицию, где &amp;lt;code&amp;gt;a[j] ≤ v&amp;lt;/code&amp;gt;, сдвигая строго большие элементы вправо. После этого &amp;lt;math&amp;gt;a[j+1] = v&amp;lt;/math&amp;gt;, и префикс &amp;lt;math&amp;gt;a[0..i]&amp;lt;/math&amp;gt; неубывающий: элементы слева &amp;lt;math&amp;gt;\le v&amp;lt;/math&amp;gt; (по построению), справа были &amp;lt;math&amp;gt;&amp;gt; v&amp;lt;/math&amp;gt; и сдвинуты. Инвариант сохранён.&lt;br /&gt;
&lt;br /&gt;
'''Завершение.''' При &amp;lt;math&amp;gt;i = n-1&amp;lt;/math&amp;gt; (после вставки) весь массив отсортирован. &amp;lt;math&amp;gt;\square&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Устойчивость ===&lt;br /&gt;
&lt;br /&gt;
Сдвигаются только элементы со строгим &amp;lt;code&amp;gt;a[j] &amp;amp;gt; v&amp;lt;/code&amp;gt;; равные остаются слева от &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; и не меняют взаимного порядка. Значит, алгоритм устойчив.&lt;br /&gt;
&lt;br /&gt;
=== Точная стоимость ===&lt;br /&gt;
&lt;br /&gt;
Каждый сдвиг переносит больший элемент через меньший, устраняя ровно одну инверсию; обратные операции инверсий не создают. Значит, число сдвигов равно &amp;lt;math&amp;gt;\text{inv}(a)&amp;lt;/math&amp;gt; — числу инверсий исходного массива. К этому добавляется по одной записи &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; на элемент, то есть&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\text{перемещений} = \text{inv}(a) + (n - 1), \qquad \text{сравнений} \le \text{inv}(a) + (n-1).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отсюда: уже отсортированный массив — &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, обратный — &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Бинарная версия ===&lt;br /&gt;
&lt;br /&gt;
Позиция ищется за &amp;lt;math&amp;gt;\lceil\log_2 i\rceil&amp;lt;/math&amp;gt; сравнений, суммарно &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt;. Но сдвиг остаётся &amp;lt;math&amp;gt;\Theta(i)&amp;lt;/math&amp;gt; в худшем, поэтому по времени алгоритм всё ещё &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;; выигрыш — только в числе сравнений (важен при дорогом сравнении ключей).&lt;br /&gt;
&lt;br /&gt;
== Сравнение с альтернативами ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Алгоритм !! Средний !! Лучший !! Устойчив !! Память !! Ниша&lt;br /&gt;
|-&lt;br /&gt;
| '''Вставками''' || &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || да || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || малые, почти отсортированные&lt;br /&gt;
|-&lt;br /&gt;
| Выбором || &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; || нет || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || мало обменов; вставки обычно лучше&lt;br /&gt;
|-&lt;br /&gt;
| Пузырьком || &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || да || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; || учебный; вставки эффективнее&lt;br /&gt;
|-&lt;br /&gt;
| Слиянием || &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; || да || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || большие &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, списки&lt;br /&gt;
|-&lt;br /&gt;
| Быстрая || &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; || нет || &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt; || большие &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, средняя скорость&lt;br /&gt;
|-&lt;br /&gt;
| Timsort || &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || да || &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; || реальные данные&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:iv-06-compare.svg|frame|none|700px|Рис. 6. Вставки проигрывают по асимптотике, но выигрывают на малых и почти отсортированных данных; отсюда — роль базы гибридов.]]&lt;br /&gt;
&lt;br /&gt;
'''Вердикт.''' Для больших случайных массивов вставки не годятся (&amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;). Их ниша — '''короткие отрезки''' (внутри гибридов) и '''почти отсортированные''' данные. Именно поэтому introsort, mergesort и Timsort используют вставки как «хвост» рекурсии.&lt;br /&gt;
&lt;br /&gt;
== Где применяется ==&lt;br /&gt;
&lt;br /&gt;
# '''База гибридных сортировок.''' introsort (&amp;lt;code&amp;gt;std::sort&amp;lt;/code&amp;gt;), mergesort, Timsort переключаются на вставки на коротких отрезках (порог 16–32). Почему: рекурсия и накладные расходы на малых отрезках дороже прямой вставки [1][4][6].&lt;br /&gt;
&lt;br /&gt;
# '''Timsort и minrun.''' Timsort удлиняет короткие серии до minrun '''бинарными вставками''' — прямое использование варианта из этой статьи [5].&lt;br /&gt;
&lt;br /&gt;
# '''Почти отсортированные данные.''' Обновлённые таблицы, инкрементальные вычисления, «подправленные» списки: стоимость &amp;lt;math&amp;gt;\Theta(n+\text{inv})&amp;lt;/math&amp;gt; делает вставки самыми быстрыми [1][3].&lt;br /&gt;
&lt;br /&gt;
# '''Онлайн-вставка.''' Поддержание отсортированного порядка при потоке элементов; на связном списке вставка = обновление указателей [3].&lt;br /&gt;
&lt;br /&gt;
# '''Shellsort.''' Вставки на подпоследовательностях с убывающими шагами — практичный &amp;lt;math&amp;gt;O(n^{1.3})&amp;lt;/math&amp;gt;–&amp;lt;math&amp;gt;O(n^{1.5})&amp;lt;/math&amp;gt; алгоритм на средних массивах [2][3].&lt;br /&gt;
&lt;br /&gt;
[[Файл:iv-07-applications.svg|frame|none|700px|Рис. 7. Вставки как база гибридов и для малых/почти отсортированных данных.]]&lt;br /&gt;
&lt;br /&gt;
== Историческая справка ==&lt;br /&gt;
&lt;br /&gt;
Сортировка вставками — одна из '''древнейших''' известных сортировок; её описывал ещё '''Джон Мокли''' (John Mauchly) в 1946 году, а систематический анализ дал '''Дональд Кнут''' в ''The Art of Computer Programming'', т. 3 (раздел 5.2.1): там же разобраны бинарный вариант, среднее число сравнений &amp;lt;math&amp;gt;\approx n^2/4&amp;lt;/math&amp;gt; и связь с инверсиями [2]. Простота и адаптивность обеспечили ей место в учебниках как первого алгоритма сортировки (CLRS, гл. 2) [1].&lt;br /&gt;
&lt;br /&gt;
'''Дональд Шелл''' в 1959 году обобщил вставки на подпоследовательности с убывающим шагом — '''Shellsort''', заметно ускорив алгоритм при малых накладных расходах [2][7]. Бинарный вариант (поиск позиции делением пополам) известен как '''binary insertion sort'''. В современных библиотеках вставки живут как «хвост» introsort/Timsort, где работают на коротких отрезках [4][5][6].&lt;br /&gt;
&lt;br /&gt;
== Типичные ошибки и подводные камни ==&lt;br /&gt;
&lt;br /&gt;
* '''Non-strict сравнение.''' &amp;lt;code&amp;gt;a[j] &amp;amp;gt;= v&amp;lt;/code&amp;gt; при сдвиге нарушает устойчивость; нужно строгое &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Ошибка границ.''' &amp;lt;code&amp;gt;j ≥ 0&amp;lt;/code&amp;gt; обязательно, иначе выход за массив при вставке в начало.&lt;br /&gt;
* '''Не сохранить &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;.''' Если не держать вставляемый элемент в переменной, его перезапишет сдвиг.&lt;br /&gt;
* '''Ожидание &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; от бинарной версии.''' Сравнений меньше, но перемещения остаются &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* '''Применение к большим случайным массивам.''' &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; катастрофичен; для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — гибриды.&lt;br /&gt;
* '''Дорогие перемещения.''' Сдвиг больших структур (не чисел) медленный — либо список, либо обмен.&lt;br /&gt;
* '''Список вместо массива без нужды.''' На списке вставка дешевле по указателям, но кэш хуже; часто массив быстрее на практике.&lt;br /&gt;
* '''Забыть про адаптивность.''' На почти отсортированных данных вставки могут обогнать quicksort — не сбрасывайте их со счетов в гибридах.&lt;br /&gt;
* '''Путаница с сортировкой выбором.''' Выбором не адаптивна и неустойчива; вставки обычно выигрывают.&lt;br /&gt;
* '''Худший вход.''' Обратный массив — &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;; в гибридах от него спасает порог и переход на другой алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Задачи для практики ==&lt;br /&gt;
&lt;br /&gt;
# '''Базовая реализация.''' Реализуйте сортировку вставками и посчитайте сравнения/сдвиги. ''Подсказка:'' инвариант — отсортированный префикс.&lt;br /&gt;
&lt;br /&gt;
# '''Инверсии.''' Докажите, что число сдвигов равно числу инверсий; проверьте на примере. ''Подсказка:'' каждый сдвиг устраняет ровно одну инверсию.&lt;br /&gt;
&lt;br /&gt;
# '''Лучший/худший.''' Для &amp;lt;math&amp;gt;n = 1000&amp;lt;/math&amp;gt; найдите точные числа сравнений на отсортированном и обратном массивах. ''Подсказка:'' &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n(n-1)/2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# '''Бинарная версия.''' Реализуйте binary insertion sort; сравните число сравнений с обычной. ''Подсказка:'' верхняя граница для устойчивости.&lt;br /&gt;
&lt;br /&gt;
# '''Список.''' Отсортируйте односвязный список вставками; оцените сравнения и обновления указателей. ''Подсказка:'' вставка между узлами.&lt;br /&gt;
&lt;br /&gt;
# '''Порог гибрида.''' Quicksort + вставки при &amp;lt;math&amp;gt;n &amp;lt; k&amp;lt;/math&amp;gt;: подберите &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; по бенчмарку. ''Подсказка:'' 16–32.&lt;br /&gt;
&lt;br /&gt;
# '''Почти отсортировано.''' Дан массив, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов не на месте; оцените время вставок через инверсии. ''Подсказка:'' &amp;lt;math&amp;gt;\Theta(n + \text{inv})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# '''Shellsort.''' Реализуйте Shellsort с шагами Хиббарда и сравните с обычными вставками. ''Подсказка:'' вставки по подпоследовательностям.&lt;br /&gt;
&lt;br /&gt;
== Связанные темы ==&lt;br /&gt;
&lt;br /&gt;
* [[Сортировки]] — обзор алгоритмов и нижняя граница &amp;lt;math&amp;gt;\Omega(n\log n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* [[Сортировка Шелла]] — обобщение вставок на убывающие шаги.&lt;br /&gt;
* [[Сортировка пузырьком]] — обменный родственник; вставки почти всегда его быстрее.&lt;br /&gt;
* [[Быстрая сортировка]] — introsort и переключение на вставки.&lt;br /&gt;
* [[Сортировка слиянием]] — гибрид с вставками на малых отрезках.&lt;br /&gt;
* [[Timsort]] — бинарные вставки для удлинения runs (minrun).&lt;br /&gt;
* [[Пирамидальная сортировка]] — другой &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;-по-памяти алгоритм.&lt;br /&gt;
* [[Асимптотическая сложность]] — лучший/средний/худший случаи.&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
&lt;br /&gt;
# Cormen T. H., Leiserson C. E., Rivest R. L., Stein C. ''Introduction to Algorithms'' (CLRS). 3rd ed. — MIT Press, 2009. — Гл. 2.1 «Insertion sort» (инвариант, анализ).&lt;br /&gt;
# Knuth D. E. ''The Art of Computer Programming''. Vol. 3: Sorting and Searching. — Addison-Wesley, 2nd ed., 1998. — §5.2.1 (insertion sort), §5.2.1 (Shellsort).&lt;br /&gt;
# Sedgewick R., Wayne K. ''Algorithms''. 4th ed. — Addison-Wesley, 2011. — §2.1 (Elementary Sorts).&lt;br /&gt;
# Musser D. R. Introspective Sorting and Selection Algorithms // Software: Practice and Experience. — 1997 (переключение на вставки в introsort).&lt;br /&gt;
# Peters T. listsort.txt (Timsort, бинарные вставки) URL: https://github.com/python/cpython/blob/main/Objects/listsort.txt .&lt;br /&gt;
# Wikipedia: Insertion sort. URL: https://en.wikipedia.org/wiki/Insertion_sort .&lt;br /&gt;
# Shell D. L. A High-Speed Sorting Procedure // CACM. — 1959. — Vol. 2, № 7 .&lt;br /&gt;
&lt;br /&gt;
[[Category:Сортировки]]&lt;/div&gt;</summary>
		<author><name>СВ</name></author>
	</entry>
</feed>