<?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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC</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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC"/>
	<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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;action=history"/>
	<updated>2026-11-03T19:12:05Z</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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=744&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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=744&amp;oldid=prev"/>
		<updated>2026-10-27T22:14:19Z</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:14, 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-l339&quot;&gt;Строка 339:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 339:&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; 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;* [[Сортировка Шелла]] &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(план) &lt;/del&gt;— родственник через comb sort.&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;* [[Сортировка Шелла]] — родственник через comb sort.&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-718:rev-744 --&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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=718&amp;oldid=prev</id>
		<title>СВ в 13:33, 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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=718&amp;oldid=prev"/>
		<updated>2026-10-26T13:33:46Z</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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;amp;diff=718&amp;amp;oldid=268&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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=268&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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=268&amp;oldid=prev"/>
		<updated>2026-09-30T19:14:45Z</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;Версия 19:14, 30 сентября 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-l288&quot;&gt;Строка 288:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 288:&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;# Dobosiewicz W. A More Efficient Variation of Bubble Sort // Information Processing Letters. — 1980; Lacey S., Box R. A Fast, Easy Sort // Dr. Dobb's Journal. — 1991 (comb sort).&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;# Dobosiewicz W. A More Efficient Variation of Bubble Sort // Information Processing Letters. — 1980; Lacey S., Box R. A Fast, Easy Sort // Dr. Dobb's Journal. — 1991 (comb sort).&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;# Wikipedia: Bubble sort. URL: https://en.wikipedia.org/wiki/Bubble_sort .&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;# Wikipedia: Bubble sort. URL: https://en.wikipedia.org/wiki/Bubble_sort .&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Сортировки]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key apmath_info_db-w:diff::1.12:old-267:rev-268 --&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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=267&amp;oldid=prev</id>
		<title>СВ: Новая страница: «== TL;DR ==  '''Сортировка пузырьком''' (bubble 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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=267&amp;oldid=prev"/>
		<updated>2026-09-30T19:13:45Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «== TL;DR ==  &amp;#039;&amp;#039;&amp;#039;Сортировка пузырьком&amp;#039;&amp;#039;&amp;#039; (bubble sort) многократно проходит по массиву, сравнивая &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;
'''Сортировка пузырьком''' (bubble sort) многократно проходит по массиву, сравнивая '''соседние''' элементы и меняя их, если они стоят не по порядку; за каждый проход наибольший элемент «всплывает» в конец рассматриваемой части. Алгоритм работает '''на месте''' (&amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; памяти) и '''устойчив''', а с '''флагом раннего выхода''' становится '''адаптивным''': на уже отсортированном массиве делает &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сравнение и завершается. Но в среднем и худшем случаях — &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt; сравнений и до &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; '''обменов''', что делает его самым «затратным» из элементарных сортировок. Поэтому на практике пузырёк почти не используется: он ценен как '''учебный пример''' инвариантов и адаптивности, а также как основа для '''comb sort''' и '''шейкерной''' сортировки.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Свойство !! Значение&lt;br /&gt;
|-&lt;br /&gt;
| Класс || Сортировка сравнением; обменная (exchange sort); на месте&lt;br /&gt;
|-&lt;br /&gt;
| Идея || Сравнение соседних пар и обмен «неправильных»&lt;br /&gt;
|-&lt;br /&gt;
| Лучший случай || &amp;lt;math&amp;gt;\Theta(n)&amp;lt;/math&amp;gt; с флагом (&amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сравнений), &amp;lt;math&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt; без&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;
| Обменов || до &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (много!)&lt;br /&gt;
|-&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;
|-&lt;br /&gt;
| Варианты || шейкерная, comb sort, сужение по последнему обмену&lt;br /&gt;
|-&lt;br /&gt;
| Родственники || [[Сортировка вставками|вставки]], [[Сортировка выбором|выбор]], [[Сортировка Шелла|Шелл]]&lt;br /&gt;
|-&lt;br /&gt;
| Где встречается || обучение, детект «отсортировано», comb sort&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Определения ==&lt;br /&gt;
&lt;br /&gt;
'''Сортировка пузырьком''' — алгоритм, который выполняет несколько '''проходов''' по массиву; на проходе сравниваются пары соседних элементов &amp;lt;math&amp;gt;(a[j], a[j+1])&amp;lt;/math&amp;gt;, и при &amp;lt;math&amp;gt;a[j] &amp;gt; a[j+1]&amp;lt;/math&amp;gt; они меняются местами.&lt;br /&gt;
&lt;br /&gt;
'''Проход (pass).''' Один линейный проход по текущей части массива. После &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го прохода последние &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов стоят на своих местах, поэтому граница прохода сужается на единицу.&lt;br /&gt;
&lt;br /&gt;
'''Обменный алгоритм (exchange sort).''' Класс сортировок, переставляющих элементы обменом соседних; пузырёк — наиболее известный представитель (иногда его зовут ''sinking sort'' — «сортировка погружением», если смотреть на всплывающий вниз максимум).&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;
'''Устойчивость''' — равные элементы сохраняют порядок; достигается использованием '''строгого''' сравнения &amp;lt;code&amp;gt;a[j] &amp;amp;gt; a[j+1]&amp;lt;/code&amp;gt; (равные не меняются).&lt;br /&gt;
&lt;br /&gt;
'''Адаптивность''' — ранний выход, если за проход '''не было обменов''': массив уже отсортирован.&lt;br /&gt;
&lt;br /&gt;
'''Обозначения.''' &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — длина массива; &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — индекс пары; &amp;lt;math&amp;gt;\text{pass}&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;
Пузырёк — вероятно, '''самый простой''' алгоритм сортировки: два вложенных цикла и обмен соседей. Его легко объяснить и запомнить, но он же и самый неэффективный по числу обменов: каждый крупный элемент продвигается вправо ровно '''на одну позицию за проход''', а обмен выполняется на каждом шаге. Поэтому на реальных данных он уступает и [[Сортировка вставками\|вставкам]], и [[Сортировка выбором\|выбору]] при той же асимптотике &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; (см. рис. 6).&lt;br /&gt;
&lt;br /&gt;
Идея в одном абзаце: '''идём по массиву и «выталкиваем» большой элемент вправо''', повторяя проходы и сужая их границу. Если за проход обменов не было — сортировать больше нечего, можно остановиться (см. рис. 2). Это делает алгоритм адаптивным на почти отсортированных данных — единственное, где пузырёк может быть полезен.&lt;br /&gt;
&lt;br /&gt;
[[Файл:bs-01-idea.svg|frame|none|700px|Рис. 1. Сравниваем соседние пары; больший «всплывает» вправо, максимум доходит до конца.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:bs-02-adaptive.svg|frame|none|700px|Рис. 2. Флаг раннего выхода превращает пузырёк в адаптивный: отсортированный вход — &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сравнений.]]&lt;br /&gt;
&lt;br /&gt;
== Устройство ==&lt;br /&gt;
&lt;br /&gt;
Обычно используется четырёхшаговая структура: внешний цикл по проходам, внутренний — по парам, сравнение и обмен. Граница внутреннего цикла уменьшается на 1 за проход (см. рис. 1 и рис. 3).&lt;br /&gt;
&lt;br /&gt;
[[Файл:bs-03-pass.svg|frame|none|700px|Рис. 3. Один проход: диапазон &amp;lt;math&amp;gt;j = 0 \dots n-2-\text{pass}&amp;lt;/math&amp;gt;; максимум уходит вправо.]]&lt;br /&gt;
&lt;br /&gt;
Две стандартные оптимизации:&lt;br /&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;
== Операции и алгоритмы ==&lt;br /&gt;
&lt;br /&gt;
=== Операция: Bubble-Sort (базовая) ===&lt;br /&gt;
&lt;br /&gt;
'''Идея.''' Сравниваем соседние пары; если пара не по порядку — меняем; так за проход максимум уходит в конец.&lt;br /&gt;
&lt;br /&gt;
'''Пошаговое описание:'''&lt;br /&gt;
&lt;br /&gt;
# Для &amp;lt;code&amp;gt;pass&amp;lt;/code&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-2&amp;lt;/math&amp;gt;:&lt;br /&gt;
# Для &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-2-\text{pass}&amp;lt;/math&amp;gt;: если &amp;lt;code&amp;gt;a[j] &amp;amp;gt; a[j+1]&amp;lt;/code&amp;gt;, обменять.&lt;br /&gt;
&lt;br /&gt;
'''Инвариант.''' Перед проходом &amp;lt;code&amp;gt;pass&amp;lt;/code&amp;gt; последние &amp;lt;code&amp;gt;pass&amp;lt;/code&amp;gt; элементов отсортированы и не меньше всех остальных (это &amp;lt;code&amp;gt;pass&amp;lt;/code&amp;gt; наибольших элементов).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Алгоритм Bubble-Sort(a)&lt;br /&gt;
Вход:  массив a[0..n−1]&lt;br /&gt;
Выход: a отсортирован по неубыванию&lt;br /&gt;
Инвариант: после прохода k a[n−k..n−1] — k наибольших, отсортированы&lt;br /&gt;
Сложность: n(n−1)/2 сравнений всегда; O(1) памяти&lt;br /&gt;
&lt;br /&gt;
1  for pass ← 0 to n − 2&lt;br /&gt;
2      for j ← 0 to n − 2 − pass&lt;br /&gt;
3          if a[j] &amp;gt; a[j + 1]        # строгое &amp;gt; → устойчивость&lt;br /&gt;
4              swap(a[j], a[j + 1])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Разбор.''' &amp;lt;code&amp;gt;[5,1,4,2,8]&amp;lt;/code&amp;gt; (см. рис. 4): проход 1 даёт &amp;lt;code&amp;gt;[1,4,2,5,8]&amp;lt;/code&amp;gt;, проход 2 — &amp;lt;code&amp;gt;[1,2,4,5,8]&amp;lt;/code&amp;gt;, проход 3 — без обменов (стоп при оптимизации).&lt;br /&gt;
&lt;br /&gt;
'''Сложность.''' Сравнений ровно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;; обменов до &amp;lt;math&amp;gt;\frac{n(n-1)}{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;\frac{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;
=== Операция: оптимизированная версия (флаг + последний обмен) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Алгоритм Bubble-Sort-Opt(a)&lt;br /&gt;
1  end ← n − 1&lt;br /&gt;
2  while end &amp;gt; 0&lt;br /&gt;
3      lastSwap ← 0&lt;br /&gt;
4      for j ← 0 to end − 1&lt;br /&gt;
5          if a[j] &amp;gt; a[j + 1]&lt;br /&gt;
6              swap(a[j], a[j + 1])&lt;br /&gt;
7              lastSwap ← j&lt;br /&gt;
8      end ← lastSwap              # если обменов не было, lastSwap = 0 → выход&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Разбор.''' Отсортированный вход: один проход, &amp;lt;code&amp;gt;lastSwap = 0&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;end = 0&amp;lt;/code&amp;gt; → стоп, &amp;lt;math&amp;gt;n-1&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;. Обменов столько же, сколько в базовой (оптимизации сокращают '''сравнения/проходы''', не число обменов).&lt;br /&gt;
&lt;br /&gt;
'''Крайние случаи.''' Полностью обратный массив — &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt; уменьшается на 1 за проход, &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; сравнений и обменов.&lt;br /&gt;
&lt;br /&gt;
[[Файл:bs-04-trace.svg|frame|none|700px|Рис. 4. Проходы, сужение границы и досрочный выход по отсутствию обменов.]]&lt;br /&gt;
&lt;br /&gt;
=== Операция: шейкерная сортировка (cocktail shaker) ===&lt;br /&gt;
&lt;br /&gt;
'''Идея.''' Чередуем проходы вперёд и назад: вперёд максимум уходит вправо, назад минимум — влево (см. рис. 5).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Алгоритм Cocktail-Sort(a)&lt;br /&gt;
1  lo ← 0 ; hi ← n − 1&lt;br /&gt;
2  while lo &amp;lt; hi&lt;br /&gt;
3      for j ← lo to hi − 1: if a[j] &amp;gt; a[j+1]: swap(a[j], a[j+1])&lt;br /&gt;
4      hi ← hi − 1&lt;br /&gt;
5      for j ← hi downto lo + 1: if a[j−1] &amp;gt; a[j]: swap(a[j−1], a[j])&lt;br /&gt;
6      lo ← lo + 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
[[Файл:bs-05-cocktail.svg|frame|none|700px|Рис. 5. Проходы в обе стороны; минимум и максимум ставятся на место за круг.]]&lt;br /&gt;
&lt;br /&gt;
=== Вариант: comb sort (кратко) ===&lt;br /&gt;
&lt;br /&gt;
Если сравнивать не соседей, а элементы с '''шагом''' &amp;lt;math&amp;gt;h &amp;gt; 1&amp;lt;/math&amp;gt;, уменьшая его (например, деля на 1.3), сортировка становится быстрее — это '''comb sort'''. Она устраняет «черепах» (мелких элементов в конце) и родственна [[Сортировка шелла\|сортировке Шелла]]; при шаге 1 превращается в обычный пузырёк.&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;\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;\Theta(n^2)&amp;lt;/math&amp;gt; || до &amp;lt;math&amp;gt;n^2/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)&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;n^2/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)&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;n^2/2&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Comb sort || &amp;lt;math&amp;gt;\approx n\log n&amp;lt;/math&amp;gt; эмпир. || &amp;lt;math&amp;gt;\approx n^{1.3}&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;
&lt;br /&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, 1, 4, 2, 8]&amp;lt;/code&amp;gt; (см. рис. 4).&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;code&amp;gt;5 1 4 2 8&amp;lt;/code&amp;gt; || 4&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || &amp;lt;code&amp;gt;1 4 2 5 8&amp;lt;/code&amp;gt; || 3&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 || &amp;lt;code&amp;gt;1 2 4 5 8&amp;lt;/code&amp;gt; || 1&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0 || &amp;lt;code&amp;gt;1 2 4 5 8&amp;lt;/code&amp;gt; || стоп (флаг)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Разбор прохода 1 (диапазон &amp;lt;math&amp;gt;j = 0..3&amp;lt;/math&amp;gt;): &amp;lt;math&amp;gt;(5,1)&amp;lt;/math&amp;gt; → обмен; &amp;lt;math&amp;gt;(5,4)&amp;lt;/math&amp;gt; → обмен; &amp;lt;math&amp;gt;(5,2)&amp;lt;/math&amp;gt; → обмен; &amp;lt;math&amp;gt;(5,8)&amp;lt;/math&amp;gt; — без обмена → &amp;lt;code&amp;gt;1 4 2 5 8&amp;lt;/code&amp;gt;. Всего сравнений: &amp;lt;math&amp;gt;4+3+2 = 9&amp;lt;/math&amp;gt;. На проходе 3 обменов нет → сортировка завершается по флагу. Трассировка сверена с реализацией из раздела «Служебное».&lt;br /&gt;
&lt;br /&gt;
== Корректность и оценка сложности ==&lt;br /&gt;
&lt;br /&gt;
=== Корректность (инвариант) ===&lt;br /&gt;
&lt;br /&gt;
'''Инвариант.''' Перед проходом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; последние &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов массива отсортированы и не меньше всех остальных.&lt;br /&gt;
&lt;br /&gt;
'''База.''' &amp;lt;math&amp;gt;k = 0&amp;lt;/math&amp;gt;: хвост пуст — верно.&lt;br /&gt;
&lt;br /&gt;
'''Сохранение.''' При проходе &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (граница &amp;lt;math&amp;gt;n-1-k&amp;lt;/math&amp;gt;) максимум среди &amp;lt;math&amp;gt;a[0..n-1-k]&amp;lt;/math&amp;gt; «всплывает» до позиции &amp;lt;math&amp;gt;n-1-k&amp;lt;/math&amp;gt;: при каждом сравнении больший сдвигается вправо, поэтому после полного прохода этот максимум стоит в &amp;lt;math&amp;gt;a[n-1-k]&amp;lt;/math&amp;gt;, а он не меньше хвоста (все прочие элементы не больше него). Значит, хвост вырос на один отсортированный максимум. Инвариант сохранён.&lt;br /&gt;
&lt;br /&gt;
'''Завершение.''' После прохода &amp;lt;math&amp;gt;n-2&amp;lt;/math&amp;gt; отсортирован весь массив (хвост размером &amp;lt;math&amp;gt;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;math&amp;gt;\sum_{k=0}^{n-2}(n-1-k) = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; — '''независимо''' от входа. Обменов: не более одного на сравнение, до &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (ровно столько на обратном массиве). С флагом лучший случай — &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сравнений и 0 обменов.&lt;br /&gt;
&lt;br /&gt;
'''Связь с инверсиями.''' Каждый обмен соседних элементов устраняет ровно одну инверсию и не создаёт новых, поэтому общее число обменов равно числу инверсий исходного массива. Отсюда: обратный массив даёт ровно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&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;
При сравнении используется строгое &amp;lt;code&amp;gt;a[j] &amp;amp;gt; a[j+1]&amp;lt;/code&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;n&amp;lt;/math&amp;gt; (флаг) / &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; || до &amp;lt;math&amp;gt;n^2/2&amp;lt;/math&amp;gt; || да || обучение, детект сортировки&lt;br /&gt;
|-&lt;br /&gt;
| [[Сортировка вставками|Вставками]] || &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; / &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;O(n+\text{inv})&amp;lt;/math&amp;gt; || да || почти всегда лучше пузырька&lt;br /&gt;
|-&lt;br /&gt;
| [[Сортировка выбором|Выбором]] || &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; / &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;\le n-1&amp;lt;/math&amp;gt; || нет || дорогая запись&lt;br /&gt;
|-&lt;br /&gt;
| [[Сортировка Шелла|Шелл]] || &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; / &amp;lt;math&amp;gt;\approx n^{1.3}&amp;lt;/math&amp;gt; || — || нет || средние массивы&lt;br /&gt;
|-&lt;br /&gt;
| [[Пирамидальная сортировка|Пирамидальная]] || &amp;lt;math&amp;gt;n\log n&amp;lt;/math&amp;gt; / &amp;lt;math&amp;gt;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;
&lt;br /&gt;
[[Файл:bs-06-compare.svg|frame|none|700px|Рис. 6. Пузырёк: та же асимптотика, но больше обменов — почти всегда худший выбор.]]&lt;br /&gt;
&lt;br /&gt;
'''Вердикт.''' Замените пузырёк на [[Сортировка вставками\|вставки]] (обычно быстрее и меньше перемещений) или на [[Сортировка выбором\|выбор]] (при дорогой записи). Пузырёк держите только для обучения и как источник идеи «флаг адаптивности» и comb sort.&lt;br /&gt;
&lt;br /&gt;
== Где применяется ==&lt;br /&gt;
&lt;br /&gt;
# '''Обучение.''' Самый наглядный пример обменной сортировки с ясным инвариантом «отсортированный хвост» и демонстрацией адаптивности [1][2].&lt;br /&gt;
&lt;br /&gt;
# '''Проверка «уже отсортировано».''' С флагом за один проход определяет, отсортирован ли массив (&amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сравнение, 0 обменов) — дешёвая проверка почти готовых данных [3].&lt;br /&gt;
&lt;br /&gt;
# '''Comb sort.''' Обобщение пузырька на шаг &amp;lt;math&amp;gt;&amp;gt;1&amp;lt;/math&amp;gt; — практичный &amp;lt;math&amp;gt;O(n^{1.3})&amp;lt;/math&amp;gt;-эмпирический алгоритм, родственный [[Сортировка шелла\|Шеллу]] [4].&lt;br /&gt;
&lt;br /&gt;
# '''Встраиваемые и учебные реализации.''' Изредка используется на крошечных массивах из-за предельной простоты; обычно уступает вставкам [3].&lt;br /&gt;
&lt;br /&gt;
[[Файл:bs-07-applications.svg|frame|none|700px|Рис. 7. Пузырёк: обучение, детект сортировки, мост к comb sort.]]&lt;br /&gt;
&lt;br /&gt;
== Историческая справка ==&lt;br /&gt;
&lt;br /&gt;
Обменные сортировки известны с первых лет вычислительной техники; сам термин '''«bubble sort»''' закрепил '''Дональд Кнут''' в ''The Art of Computer Programming'', т. 3 (§5.2.2), где разобраны его инварианты, число сравнений и обменов и отмечена низкая эффективность [2]. Пузырёк часто приписывают ранним работам по сортировке, но как «рабочий» алгоритм он был вытеснен [[Сортировка вставками\|вставками]] и [[Сортировка выбором\|выбором]] ещё до появления быстрых &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt;-методов.&lt;br /&gt;
&lt;br /&gt;
Обобщение на '''шаг''' — '''comb sort''' — описали '''Влодзимеж Добосевич''' (Dobosiewicz, 1980) и позже исследовали Лейси и Бокс (1991), назвавшие его comb sort и подобравшие коэффициент уменьшения шага &amp;lt;math&amp;gt;\approx 1.3&amp;lt;/math&amp;gt; [4]. Шейкерная сортировка (cocktail shaker sort) — прямой двунаправленный вариант пузырька.&lt;br /&gt;
&lt;br /&gt;
== Типичные ошибки и подводные камни ==&lt;br /&gt;
&lt;br /&gt;
* '''Нет флага — нет адаптивности.''' Без раннего выхода пузырёк делает &amp;lt;math&amp;gt;n^2/2&amp;lt;/math&amp;gt; сравнений даже на отсортированном массиве.&lt;br /&gt;
* '''Неверная граница прохода.''' &amp;lt;code&amp;gt;j &amp;amp;lt; n-1-pass&amp;lt;/code&amp;gt; (а не &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt;), иначе лишние сравнения или выход за массив.&lt;br /&gt;
* '''Неустойчивость при &amp;lt;code&amp;gt;&amp;amp;gt;=&amp;lt;/code&amp;gt;.''' Замена сравнения на &amp;lt;code&amp;gt;a[j] &amp;amp;gt;= a[j+1]&amp;lt;/code&amp;gt; ломает устойчивость.&lt;br /&gt;
* '''Много обменов.''' До &amp;lt;math&amp;gt;n^2/2&amp;lt;/math&amp;gt; обменов против &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; у выбора — главный минус на практике.&lt;br /&gt;
* '''&amp;lt;code&amp;gt;lastSwap&amp;lt;/code&amp;gt; как индекс vs позиция.''' Классическая ошибка: сохранять &amp;lt;code&amp;gt;j+1&amp;lt;/code&amp;gt; и не сужать границу (см. сноску к optimized-версии).&lt;br /&gt;
* '''Применение на больших массивах.''' &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; неприемлемо; используйте &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt;-алгоритмы.&lt;br /&gt;
* '''Путаница с comb sort.''' Comb sort — не «пузырёк», а его обобщение с шагом; при шаге 1 совпадает с ним.&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;
# '''Флаг.''' Добавьте ранний выход и покажите, что на отсортированном массиве &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сравнений. ''Подсказка:'' флаг обмена.&lt;br /&gt;
&lt;br /&gt;
# '''Последний обмен.''' Реализуйте сужение по последнему обмену; сравните число проходов. ''Подсказка:'' &amp;lt;code&amp;gt;end = lastSwap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# '''Шейкер.''' Реализуйте cocktail shaker и сравните на входе с «большим в начале, маленьким в конце». ''Подсказка:'' проходы в обе стороны.&lt;br /&gt;
&lt;br /&gt;
# '''Обмены.''' Докажите, что обменов не больше, чем сравнений, и постройте вход с ровно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; обменами. ''Подсказка:'' обратный массив.&lt;br /&gt;
&lt;br /&gt;
# '''Устойчивость.''' Приведите контрпример для &amp;lt;code&amp;gt;&amp;amp;gt;=&amp;lt;/code&amp;gt; и проверьте, что при &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; порядок равных сохраняется. ''Подсказка:'' пары (ключ, метка).&lt;br /&gt;
&lt;br /&gt;
# '''Comb sort.''' Реализуйте comb sort с шагом, делящимся на 1.3, и сравните с пузырьком. ''Подсказка:'' при шаге 1 — обычный пузырёк.&lt;br /&gt;
&lt;br /&gt;
# '''Сравнение.''' Для &amp;lt;math&amp;gt;n = 1000&amp;lt;/math&amp;gt; сравните сравнения и обмены пузырька, вставок и выбора. ''Подсказка:'' вставки адаптивны, выбор экономит обмены.&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;
* [[Сортировка Шелла]] — родственник через comb sort.&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-2 (bubble sort; инвариант, число инверсий).&lt;br /&gt;
# Knuth D. E. ''The Art of Computer Programming''. Vol. 3: Sorting and Searching. — Addison-Wesley, 2nd ed., 1998. — §5.2.2 (bubble sort; анализ).&lt;br /&gt;
# Sedgewick R., Wayne K. ''Algorithms''. 4th ed. — Addison-Wesley, 2011. — §2.1 (Elementary Sorts).&lt;br /&gt;
# Dobosiewicz W. A More Efficient Variation of Bubble Sort // Information Processing Letters. — 1980; Lacey S., Box R. A Fast, Easy Sort // Dr. Dobb's Journal. — 1991 (comb sort).&lt;br /&gt;
# Wikipedia: Bubble sort. URL: https://en.wikipedia.org/wiki/Bubble_sort .&lt;/div&gt;</summary>
		<author><name>СВ</name></author>
	</entry>
</feed>