<?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%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://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%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://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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;action=history"/>
	<updated>2026-07-18T15:08:04Z</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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=50504&amp;oldid=prev</id>
		<title>imported&gt;Bezik: -программы на Яве и Питоне, пунктуация по замеченному</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%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC&amp;diff=50504&amp;oldid=prev"/>
		<updated>2026-01-02T18:17:54Z</updated>

		<summary type="html">&lt;p&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;
| изображение = Bubble-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;&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(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|bubble sort}}), &amp;#039;&amp;#039;&amp;#039;сортиро́вка простыми обменами&amp;#039;&amp;#039;&amp;#039;, метод сортировки обменами — один из [[алгоритм сортировки|алгоритмов сортировки]]. По сравнению с другими алгоритмами считается простейшим для понимания и реализации. Эффективен для массивов небольшого размера. &amp;lt;math&amp;gt;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;
Алгоритм считается учебным, вне учебной литературы не применяется (на практике применяются более эффективные (совершенные) алгоритмы). Лежит в основе некоторых более эффективных алгоритмов, например, алгоритма [[шейкерная сортировка|шейкерной сортировки]], алгоритма [[пирамидальная сортировка|пирамидальной сортировки]] и алгоритма [[быстрая сортировка|быстрой сортировки]].&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; раз, либо до тех пор, пока на очередном проходе не обнаружится, что более не требуется выполнять перестановки (обмены) (массив отсортирован).&lt;br /&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;.&lt;br /&gt;
&lt;br /&gt;
Для наихудшего случая верно следующее:&lt;br /&gt;
* элементы массива упорядочены по убыванию (например, «3 2 1»);&lt;br /&gt;
* количество сравнений, выполняемых в теле цикла, равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;gt;;&lt;br /&gt;
* количество сравнений, выполняемых в заголовках циклов, равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;gt;;&lt;br /&gt;
* суммарное количество сравнений равно &amp;lt;math&amp;gt;(n-1) \cdot n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* количество присваиваний в заголовках циклов равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;gt;;&lt;br /&gt;
* количество перестановок равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;gt; (что в &amp;lt;math&amp;gt;\frac n 2&amp;lt;/math&amp;gt; раз больше, чем при [[Сортировка выбором|сортировке выбором]]).&lt;br /&gt;
&lt;br /&gt;
Для наилучшего случая верно следующее:&lt;br /&gt;
* элементы массива упорядочены по возрастанию (например, «1 2 3»);&lt;br /&gt;
* количество сравнений, выполняемых в теле цикла, равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;gt;;&lt;br /&gt;
* количество сравнений, выполняемых в заголовках циклов, равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;gt;;&lt;br /&gt;
* суммарное количество сравнений равно &amp;lt;math&amp;gt;(n-1) \cdot n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* количество перестановок равно числу 0.&lt;br /&gt;
&lt;br /&gt;
После 1-го прохода (завершения внутреннего цикла) максимальный элемент массива находится в позиции номер &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;. После 2-го прохода следующий по значению максимальный элемент находится в позиции номер &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;. И так далее. Для каждого следующего прохода по сравнению с текущим проходом количество обрабатываемых элементов меньше на единицу. Нет необходимости каждый проход перебирать все пары элементов («обходить» весь массив) от начала массива к концу массива.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; (массив содержит один элемент), то не требуется сортировать массив. Если &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;, для сортировки массива требуется выполнить не более &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; итераций внешнего цикла. Некоторые реализации выполняют тело внешнего цикла &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; раз и не учитывают (не отслеживают) информацию о том, были ли или не были перестановки на каждой итерации цикла.&lt;br /&gt;
&lt;br /&gt;
Если на вход подаётся частично отсортированный массив, то можно уменьшить количество проходов по массиву — ввести индикатор произошедших перестановок (флажок F). Перед каждым проходом по внутреннему циклу флажок F сбрасывается в 0, а после перестановки — устанавливается в 1. Если после выполнения внутреннего цикла флажок F равен 0, то при выполнении внутреннего цикла перестановок не было; то есть, массив отсортирован и можно досрочно выйти из программы сортировки.&lt;br /&gt;
&lt;br /&gt;
Псевдокод улучшенного алгоритма — алгоритма с проверкой, были ли перестановки во внутреннем цикле.&lt;br /&gt;
&lt;br /&gt;
На входе: массив &amp;lt;math&amp;gt;A[n]&amp;lt;/math&amp;gt; — массив, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов. 1-й элемент обозначен как &amp;lt;math&amp;gt;A[0]&amp;lt;/math&amp;gt;, последний — как &amp;lt;math&amp;gt;A[n-1]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
 ЦИКЛ ДЛЯ J=1 ДО n-1 ШАГ 1                       FOR J=1 TO n-1 STEP 1&lt;br /&gt;
   F=0                                             F=0&lt;br /&gt;
   ЦИКЛ ДЛЯ I=0 ДО n-1-J ШАГ 1                     FOR I=0 TO n-1-J STEP 1&lt;br /&gt;
     ЕСЛИ A[I] &amp;gt; A[I+1] ТО ОБМЕН A[I],A[I+1]:F=1     IF A[I]&amp;gt;A[I+1] THEN SWAP A[I],A[I+1]:F=1&lt;br /&gt;
   СЛЕДУЮЩЕЕ I                                     NEXT I&lt;br /&gt;
   ЕСЛИ F=0 ТО ВЫХОД ИЗ ЦИКЛА                      IF F=0 THEN EXIT FOR&lt;br /&gt;
 СЛЕДУЮЩЕЕ J                                     NEXT J&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Чтобы досрочно завершить программу сортировки, требуется выполнить один (избыточный) проход без обменов.&lt;br /&gt;
&lt;br /&gt;
Для наихудшего (неулучшаемого) случая верно следующее:&lt;br /&gt;
* количество сравнений, выполняемых в теле цикла, равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;gt;;&lt;br /&gt;
* количество сравнений, выполняемых в заголовках циклов, равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;gt;;&lt;br /&gt;
* суммарное количество сравнений равно &amp;lt;math&amp;gt;(n-1) \cdot n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* количество присваиваний в заголовках циклов равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;gt;;&lt;br /&gt;
* количество перестановок равно &amp;lt;math&amp;gt;(n-1) \cdot \frac n 2&amp;lt;/math&amp;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;
* количество сравнений, выполняемых в заголовках циклов, равно &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* суммарное количество сравнений равно &amp;lt;math&amp;gt;2 \cdot (n-1)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* количество перестановок (обменов) равно числу 0.&lt;br /&gt;
&lt;br /&gt;
На [[Программно-аппаратный комплекс|программно-аппаратном комплексе]], выполняющем сравнение примерно 3,4 мкс и выполняющем перестановку примерно 2,3 мкс, время сортировки 10 тыс. коротких целых чисел реализацией алгоритма [[Сортировка выбором|сортировки выбором]] составило примерно 40 с, ещё более улучшенной сортировкой пузырьком — примерно 30 с, а [[Быстрая сортировка|быстрой сортировкой]] — примерно 0,027 с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(n \cdot n)&amp;lt;/math&amp;gt; больше, чем &amp;lt;math&amp;gt;O(n \cdot \log 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 \cdot n)&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;
Сортировка по возрастанию списка «5 1 4 2 8» требует три прохода (выделены те элементы, которые сравниваются на текущем этапе).&lt;br /&gt;
[[Файл:Bubble-sort-example-300px.gif|alt=Анимация, показывающая пример работы алгоритма.|thumb|Наглядная демонстрация алгоритма.]]&lt;br /&gt;
Первый проход:&lt;br /&gt;
: (&amp;#039;&amp;#039;&amp;#039;5 1&amp;#039;&amp;#039;&amp;#039; 4 2 8) (&amp;#039;&amp;#039;&amp;#039;1 5&amp;#039;&amp;#039;&amp;#039; 4 2 8), здесь алгоритм сравнивает два первых элемента и меняет их местами;&lt;br /&gt;
: (1 &amp;#039;&amp;#039;&amp;#039;5 4&amp;#039;&amp;#039;&amp;#039; 2 8) (1 &amp;#039;&amp;#039;&amp;#039;4 5&amp;#039;&amp;#039;&amp;#039; 2 8), меняет местами, так как &amp;lt;math&amp;gt;5&amp;gt;4&amp;lt;/math&amp;gt;;&lt;br /&gt;
: (1 4 &amp;#039;&amp;#039;&amp;#039;5 2&amp;#039;&amp;#039;&amp;#039; 8) (1 4 &amp;#039;&amp;#039;&amp;#039;2 5&amp;#039;&amp;#039;&amp;#039; 8), меняет местами, так как &amp;lt;math&amp;gt;5&amp;gt;2&amp;lt;/math&amp;gt;;&lt;br /&gt;
: (1 4 2 &amp;#039;&amp;#039;&amp;#039;5 8&amp;#039;&amp;#039;&amp;#039;) (1 4 2 &amp;#039;&amp;#039;&amp;#039;5 8&amp;#039;&amp;#039;&amp;#039;), ввиду того, что элементы стоят на своих местах (&amp;lt;math&amp;gt;8&amp;gt;5&amp;lt;/math&amp;gt;), алгоритм не меняет их местами.&lt;br /&gt;
&lt;br /&gt;
Второй проход:&lt;br /&gt;
: (&amp;#039;&amp;#039;&amp;#039;1 4&amp;#039;&amp;#039;&amp;#039; 2 5 8) (&amp;#039;&amp;#039;&amp;#039;1 4&amp;#039;&amp;#039;&amp;#039; 2 5 8);&lt;br /&gt;
: (1 &amp;#039;&amp;#039;&amp;#039;4 2&amp;#039;&amp;#039;&amp;#039; 5 8) (1 &amp;#039;&amp;#039;&amp;#039;2 4&amp;#039;&amp;#039;&amp;#039; 5 8), меняет местами, так как &amp;lt;math&amp;gt;4&amp;gt;2&amp;lt;/math&amp;gt;;&lt;br /&gt;
: (1 2 &amp;#039;&amp;#039;&amp;#039;4 5&amp;#039;&amp;#039;&amp;#039; 8) (1 2 &amp;#039;&amp;#039;&amp;#039;4 5&amp;#039;&amp;#039;&amp;#039; 8);&lt;br /&gt;
&lt;br /&gt;
Теперь массив полностью отсортирован, но алгоритму это неизвестно. Необходимо сделать полный проход, чтобы определить, что перестановок (обменов) элементов не было.&lt;br /&gt;
&lt;br /&gt;
Третий проход:&lt;br /&gt;
: (&amp;#039;&amp;#039;&amp;#039;1 2&amp;#039;&amp;#039;&amp;#039; 4 5 8) (&amp;#039;&amp;#039;&amp;#039;1 2&amp;#039;&amp;#039;&amp;#039; 4 5 8);&lt;br /&gt;
: (1 &amp;#039;&amp;#039;&amp;#039;2 4&amp;#039;&amp;#039;&amp;#039; 5 8) (1 &amp;#039;&amp;#039;&amp;#039;2 4&amp;#039;&amp;#039;&amp;#039; 5 8).&lt;br /&gt;
&lt;br /&gt;
Теперь массив отсортирован и алгоритм может быть завершён.&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{Навигация&lt;br /&gt;
|Викиучебник = Примеры реализации сортировки пузырьком&lt;br /&gt;
}}&lt;br /&gt;
* [https://airtucha.github.io/SortVis/ Динамическая визуализация 7 алгоритмов сортировки с открытым исходным кодом]&lt;br /&gt;
* {{source|Q21694522|part=Глава 3. Метод грубой силы: Пузырьковая сортировка|pages=144—146}}&lt;br /&gt;
&lt;br /&gt;
{{Нет источников |дата=2012-08-09}}&lt;br /&gt;
{{ВС}}&lt;br /&gt;
{{Алгоритмы сортировки}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы сортировки]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Bezik</name></author>
	</entry>
</feed>