<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/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://camokathomelab.servebeer.com/mediawiki/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://camokathomelab.servebeer.com/mediawiki/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-07-18T02:46:12Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/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=51866&amp;oldid=prev</id>
		<title>imported&gt;Железный капут: Бот: откат правок 81.23.202.156 по запросу MBH</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/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=51866&amp;oldid=prev"/>
		<updated>2025-09-20T14:55:10Z</updated>

		<summary type="html">&lt;p&gt;Бот: откат правок &lt;a href=&quot;/mediawiki/index.php/%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/81.23.202.156&quot; title=&quot;Служебная:Вклад/81.23.202.156&quot;&gt;81.23.202.156&lt;/a&gt; по запросу &lt;a href=&quot;/mediawiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:MBH&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Участник:MBH (страница не существует)&quot;&gt;MBH&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Алгоритм&lt;br /&gt;
| предназначение = [[Алгоритм сортировки]]&lt;br /&gt;
| изображение = Insertion-sort-example-300px.gif&lt;br /&gt;
| подпись = Пример сортировки вставками&lt;br /&gt;
| данные = [[Массив (программирование)|Массив]]&lt;br /&gt;
| время = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; сравнений, обменов&lt;br /&gt;
| лучшее-время = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; сравнений, 0 обменов&lt;br /&gt;
| среднее-время = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; сравнений, обменов&lt;br /&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;#039;&amp;#039;&amp;#039;Сортировка вставками&amp;#039;&amp;#039;&amp;#039; ({{lang-en|Insertion sort}}) — [[алгоритм сортировки]], в котором элементы входной последовательности просматриваются по одному, и каждый новый поступивший элемент размещается в подходящее место среди ранее упорядоченных элементов&amp;lt;ref&amp;gt;{{Книга:Кнут|3|часть=5.2 Внутренняя сортировка|ref=Кнут}}&amp;lt;/ref&amp;gt;. [[Вычислительная сложность]] — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание ==&lt;br /&gt;
[[Файл:Dsa ins sort.png|thumb|left|400px|Пример сортировки вставками]]&lt;br /&gt;
На вход алгоритма подаётся последовательность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: &amp;lt;math&amp;gt;a_1, a_2, ..., a_n&amp;lt;/math&amp;gt;. Сортируемые числа также называют &amp;#039;&amp;#039;ключами&amp;#039;&amp;#039;. Входная последовательность на практике представляется в виде массива с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементами. На выходе алгоритм должен вернуть перестановку исходной последовательности &amp;lt;math&amp;gt;a_{1}^{&amp;#039;}, a_{2}^{&amp;#039;}, ..., a_{n}^{&amp;#039;}&amp;lt;/math&amp;gt;, чтобы выполнялось следующее соотношение &amp;lt;math&amp;gt;a_{1}^{&amp;#039;} \leqslant a_{2}^{&amp;#039;} \leqslant ... \leqslant a_{n}^{&amp;#039;}&amp;lt;/math&amp;gt;{{sfn|Кормен|2013|p=38}}.&lt;br /&gt;
&lt;br /&gt;
В начальный момент отсортированная последовательность пуста. На каждом шаге алгоритма выбирается один из элементов входных данных и помещается на нужную позицию в уже отсортированной последовательности до тех пор, пока набор входных данных не будет исчерпан. В любой момент времени в отсортированной последовательности элементы удовлетворяют требованиям к выходным данным алгоритма{{sfn|Кормен|2013|p=39}}.&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм можно ускорить при помощи использования бинарного поиска для нахождения места текущему элементу в отсортированной части. Проблема с долгим сдвигом массива вправо решается при помощи смены указателей&amp;lt;ref&amp;gt;{{Книга:Кнут|3|часть=5.2.1 Сортировка путём вставок|ref=Кнут}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
На вход процедуре сортировки подаётся массив &amp;lt;math&amp;gt;A[1..n]&amp;lt;/math&amp;gt;, состоящий из элементов последовательности &amp;lt;math&amp;gt;A[1], A[2], ..., A[n]&amp;lt;/math&amp;gt;, которые требуется отсортировать. &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; соответствует &amp;lt;math&amp;gt;A.\mathrm{length}&amp;lt;/math&amp;gt; — размеру исходного массива. Для сортировки не требуется привлечения дополнительной памяти, кроме постоянной величины для одного элемента, так как выполняется перестановка в пределах массива. В результате работы процедуры во входном массиве оказывается требуемая выходная последовательность элементов{{sfn|Кормен|2013|p=39—40}}.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
 &lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; j = 2 &amp;#039;&amp;#039;&amp;#039;to&amp;#039;&amp;#039;&amp;#039; A.length &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
     key = A[j]&lt;br /&gt;
     i = j-1&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039; (i &amp;gt; 0 and A[i] &amp;gt; key) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
         A[i + 1] = A[i]&lt;br /&gt;
         i = i - 1&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;end while&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     A[i+1] = key&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;end &amp;#039;&amp;#039;&amp;#039;{{sfn|Кормен|2013|p=39—40}}&lt;br /&gt;
|&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; i = 2 &amp;#039;&amp;#039;&amp;#039;to&amp;#039;&amp;#039;&amp;#039; n &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
     x = A[i]&lt;br /&gt;
     j = i&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039; (j &amp;gt; 1 and A[j-1] &amp;gt; x) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
         A[j] = A[j-1]&lt;br /&gt;
         j = j - 1&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;end while&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     A[j] = x&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;end for&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Книга|автор=Н. Вирт|заглавие=Алгоритмы и структуры данных|ответственный=|издание=|место=М.|издательство=ДМК Пресс|год=2010|страницы=74|страниц=272|isbn=987-5-94074-584-6}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
 A[0] = -&amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039; i = 2 &amp;#039;&amp;#039;&amp;#039;to&amp;#039;&amp;#039;&amp;#039; n &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
     j = i&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039; (j &amp;gt; 0 and A[j] &amp;lt; A[j - 1]) &amp;#039;&amp;#039;&amp;#039;do&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
         &amp;#039;&amp;#039;&amp;#039;swap&amp;#039;&amp;#039;&amp;#039; (A[j], A[j - 1])&lt;br /&gt;
         j = j - 1&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;end while&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;end for&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Книга|автор=Скиена С.|заглавие=Алгоритмы. Руководство по разработке|ссылка=https://archive.org/details/algoritmyrukovod0000unse/page/137|ответственный=|издание=2-е|место=СПб.|издательство=БХВ-Петербург|год=2014|страницы=137|страниц=720|isbn=978-5-9775-0560-4}}&amp;lt;/ref&amp;gt;{{sfn|Ахо|2000|p=237}}&lt;br /&gt;
|}&lt;br /&gt;
В последнем варианте обмен &amp;lt;code&amp;gt;x = A[j]; A[j] = A[j-1]; A[j-1] = x&amp;lt;/code&amp;gt; представлен операцией swap из-за чего он немного медленнее. Значение введённого А[0] меньше любого значения остальных элементов{{sfn|Ахо|2000|p=237}}.&lt;br /&gt;
&lt;br /&gt;
== Анализ алгоритма ==&lt;br /&gt;
Время выполнения алгоритма зависит от входных данных: чем большее множество нужно отсортировать, тем большее время потребуется для выполнения сортировки. Также на время выполнения влияет исходная упорядоченность массива. Время работы алгоритма для различных входных данных одинакового размера зависит от элементарных операций, или шагов, которые потребуется выполнить{{sfn|Кормен|2013|p=47}}.&lt;br /&gt;
&lt;br /&gt;
Для каждой инструкции алгоритма введём временную стоимость и количество повторений, где &amp;lt;math&amp;gt;t_j&amp;lt;/math&amp;gt; — количество проверок условия во внутреннем цикле &amp;#039;&amp;#039;while&amp;#039;&amp;#039;{{sfn|Кормен|2013|p=48}}:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; width=&amp;quot;80%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!width=&amp;quot;40%&amp;quot;|Код&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Стоимость&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Повторы&lt;br /&gt;
|-&lt;br /&gt;
|for j = 2 to A.length&lt;br /&gt;
|&amp;lt;math&amp;gt;c_1&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|key = A[j]&lt;br /&gt;
|&amp;lt;math&amp;gt;c_2&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|i = j — 1&lt;br /&gt;
|&amp;lt;math&amp;gt;c_3&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|while i &amp;gt; 0 and A[i] &amp;gt; key&lt;br /&gt;
|&amp;lt;math&amp;gt;c_4&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\sum_{j=2}^n t_j&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|A[i+1] = A[i]&lt;br /&gt;
|&amp;lt;math&amp;gt;c_5&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\sum_{j=2}^n (t_j-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|i = i — 1&lt;br /&gt;
|&amp;lt;math&amp;gt;c_6&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\sum_{j=2}^n (t_j-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|A[i+1] = key&lt;br /&gt;
|&amp;lt;math&amp;gt;c_7&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма сортировки вставками — это сумма времён работы каждого шага{{sfn|Кормен|2013|p=48—49}}: &amp;lt;math&amp;gt;T(n)=c_1n+c_2(n-1)+c_3(n-1)+c_4\sum_{j=2}^n t_j+c_5\sum_{j=2}^n (t_j-1)+c_6\sum_{j=2}^n (t_j-1)+c_7(n-1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Самым благоприятным случаем является отсортированный массив. При этом все внутренние циклы состоят всего из одной итерации, то есть &amp;lt;math&amp;gt;t_j=1&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;. Тогда время работы алгоритма составит &amp;lt;math&amp;gt;T(n)=(c_1+c_2+c_3+c_4+c_7)n-(c_2+c_3+c_4+c_7)=O(n)&amp;lt;/math&amp;gt;. Время работы линейно зависит от размера входных данных{{sfn|Кормен|2013|p=49}}.&lt;br /&gt;
&lt;br /&gt;
=== Анализ наихудшего случая ===&lt;br /&gt;
Наихудшим случаем является массив, отсортированный в порядке, обратном нужному. При этом каждый новый элемент сравнивается со всеми в отсортированной последовательности. Это означает, что все внутренние циклы состоят из j итераций, то есть &amp;lt;math&amp;gt;t_j=j&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;. Тогда время работы алгоритма составит:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(n)=c_1n+c_2(n-1)+c_3(n-1)+c_4\sum_{j=2}^n j+c_5\sum_{j=2}^n (j-1)+c_6\sum_{j=2}^n (j-1)+c_7(n-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(n)=c_1n+c_2(n-1)+c_3(n-1)+c_4\left(\frac{n(n+1)}{2}-1\right)+c_5\frac{n(n-1)}{2}+c_6\frac{n(n-1)}{2}+c_7(n-1)=O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы является квадратичной функцией от размера входных данных{{sfn|Кормен|2013|p=49—50}}.&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;i+1&amp;lt;/math&amp;gt; положений. Предполагая случайные входные данные, новый элемент равновероятно может оказаться в любой позиции{{sfn|Макконнелл|2004|p=74}}. Среднее число сравнений для вставки &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента{{sfn|Макконнелл|2004|p=75}}:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_i=\frac{1}{i+1}\left(\sum_{p=1}^i p+i\right)=\frac{1}{i+1}\left(\frac{i(i+1)}{2}+i\right)=\frac{i}{2}+1-\frac{1}{i+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для оценки среднего времени работы для &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов нужно просуммировать{{sfn|Макконнелл|2004|p=75—76}}:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(n)=\sum_{i=1}^{n-1} T_i=\sum_{i=1}^{n-1} \left(\frac{i}{2}+1-\frac{1}{i+1}\right)=\sum_{i=1}^{n-1} \frac{i}{2}+\sum_{i=1}^{n-1} 1-\sum_{i=1}^{n-1} \left(\frac{1}{i+1}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(n)\approx\frac{n^2-n}{4}+(n-1)-(\ln(n)-1)=O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Временная [[сложность алгоритма]] — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Однако, из-за константных множителей и членов более низкого порядка алгоритм с более высоким порядком роста может выполняться для небольших входных данных быстрее, чем алгоритм с более низким порядком роста{{sfn|Кормен|2013|p=51}}.&lt;br /&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;
{{примечания|3}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{Книга:Ахо. Структуры данных и алгоритмы|страницы=231|ref=Ахо}}&lt;br /&gt;
* {{Книга:Кнут|3|часть=5.2.1 Сортировка путём вставок|ref=Кнут}}&lt;br /&gt;
* {{Книга:CLRS|2013|часть=2.1. Сортировка вставкой|страницы=38—45|ref=Кормен}}&lt;br /&gt;
* {{Книга:Основы современных алгоритмов|страницы=72—76|ref=Макконнелл}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{wikibooks|Примеры реализации сортировки вставками|Примеры реализации сортировки вставками}}&lt;br /&gt;
* [http://algolist.manual.ru/sort/insert_sort.php Сортировка вставками]&lt;br /&gt;
* [http://kvodo.ru/sortirovka-vstavkami-2.html Реализация сортировки вставками на Pascal и C++]&lt;br /&gt;
* [http://www.sorting-algorithms.com/insertion-sort Анимированное представление алгоритма сортировки вставками]&lt;br /&gt;
&lt;br /&gt;
{{Алгоритмы сортировки}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы сортировки]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Железный капут</name></author>
	</entry>
</feed>