<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexeyshekhanov</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexeyshekhanov"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%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/Alexeyshekhanov"/>
	<updated>2026-10-22T23:57:01Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29594</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29594"/>
		<updated>2023-12-05T18:33:28Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: 1. Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. 2. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. 3. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. 4. После первого прохода самый большой элемент окажется в конце списка. 5. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
Информационный граф состоит из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; итераций, где разбиение элементов на пары начинается с нулевого элемента на каждой четной начинается, а на каждой нечетной с первого. Каждую такую пару может обрабатывать отдельный поток, независимо от других.&lt;br /&gt;
[[Файл:Информационный граф1.png|мини|Рис 1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
Это можно увидеть на примере, который изображен на рис. 2. Красным обведены элементы, которые сравниваются и &amp;quot;обмениваются&amp;quot; на данной итерации.&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg|мини|Рис 2. Пример с массивом размера 6, количеством потоков 3]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(1)&amp;lt;/math&amp;gt;, а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
Масштабируемость алгоритма сортировки пузырьком определяется размером входных данных и количеством доступных потоков. &lt;br /&gt;
1. В случае с входными данными, чем больше их размер, тем лучше масштабируемость.&lt;br /&gt;
2. В случае же с доступными потоками, то не всегда их число прямо пропорционально влияет на скорость выполнения сортировки. С какого то количества потоков, в зависимости от размера входных данных, сортировка начинает выполняться все медленнее и медленнее из за накладных расходов, таких как создание потоков, их синхронизация и т.п.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
4kb.png|Зависимость времени сортировки от количества потоков при размере входных данных 4 Кбайт.&lt;br /&gt;
40kb.png|Зависимость времени сортировки от количества потоков при размере входных данных 40 Кбайт.&lt;br /&gt;
400kb.png|Зависимость времени сортировки от количества потоков при размере входных данных 400 Кбайт.&lt;br /&gt;
4mb.png|Зависимость времени сортировки от количества потоков при размере входных данных 4 Мбайт.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29593</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29593"/>
		<updated>2023-12-05T18:32:28Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
Информационный граф состоит из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; итераций, где разбиение элементов на пары начинается с нулевого элемента на каждой четной начинается, а на каждой нечетной с первого. Каждую такую пару может обрабатывать отдельный поток, независимо от других.&lt;br /&gt;
[[Файл:Информационный граф1.png|мини|Рис 1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
Это можно увидеть на примере, который изображен на рис. 2. Красным обведены элементы, которые сравниваются и &amp;quot;обмениваются&amp;quot; на данной итерации.&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg|мини|Рис 2. Пример с массивом размера 6, количеством потоков 3]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(1)&amp;lt;/math&amp;gt;, а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
Масштабируемость алгоритма сортировки пузырьком определяется размером входных данных и количеством доступных потоков. &lt;br /&gt;
1. В случае с входными данными, чем больше их размер, тем лучше масштабируемость.&lt;br /&gt;
2. В случае же с доступными потоками, то не всегда их число прямо пропорционально влияет на скорость выполнения сортировки. С какого то количества потоков, в зависимости от размера входных данных, сортировка начинает выполняться все медленнее и медленнее из за накладных расходов, таких как создание потоков, их синхронизация и т.п.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
4kb.png|Зависимость времени сортировки от количества потоков при размере входных данных 4 Кбайт.&lt;br /&gt;
40kb.png|Зависимость времени сортировки от количества потоков при размере входных данных 40 Кбайт.&lt;br /&gt;
400kb.png|Зависимость времени сортировки от количества потоков при размере входных данных 400 Кбайт.&lt;br /&gt;
4mb.png|Зависимость времени сортировки от количества потоков при размере входных данных 4 Мбайт.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29592</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29592"/>
		<updated>2023-12-05T18:30:04Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
Информационный граф состоит из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; итераций, где разбиение элементов на пары начинается с нулевого элемента на каждой четной начинается, а на каждой нечетной с первого. Каждую такую пару может обрабатывать отдельный поток, независимо от других.&lt;br /&gt;
[[Файл:Информационный граф1.png|мини|Рис 1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
Это можно увидеть на примере, который изображен на рис. 2&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg|мини|Рис 2. Пример с массивом размера 6, количеством потоков 3]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(1)&amp;lt;/math&amp;gt;, а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
Масштабируемость алгоритма сортировки пузырьком определяется размером входных данных и количеством доступных потоков. &lt;br /&gt;
1. В случае с входными данными, чем больше их размер, тем лучше масштабируемость.&lt;br /&gt;
2. В случае же с доступными потоками, то не всегда их число прямо пропорционально влияет на скорость выполнения сортировки. С какого то количества потоков, в зависимости от размера входных данных, сортировка начинает выполняться все медленнее и медленнее из за накладных расходов, таких как создание потоков, их синхронизация и т.п.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
4kb.png|Зависимость времени сортировки от количества потоков при размере входных данных 4 Кбайт.&lt;br /&gt;
40kb.png|Зависимость времени сортировки от количества потоков при размере входных данных 40 Кбайт.&lt;br /&gt;
400kb.png|Зависимость времени сортировки от количества потоков при размере входных данных 400 Кбайт.&lt;br /&gt;
4mb.png|Зависимость времени сортировки от количества потоков при размере входных данных 4 Мбайт.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29591</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29591"/>
		<updated>2023-12-05T18:26:43Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
Информационный граф состоит из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; итераций, где разбиение элементов на пары начинается с нулевого элемента на каждой четной начинается, а на каждой нечетной с первого. Каждую такую пару может обрабатывать отдельный поток, независимо от других.&lt;br /&gt;
[[Файл:Информационный граф1.png|мини|Рис 1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
Это можно увидеть на примере, который изображен на рис. 2&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg|мини|Рис 2. Пример с массивом размера 6, количеством потоков 3]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(1)&amp;lt;/math&amp;gt;, а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
4kb.jpg|Зависимость времени сортировки от количества потоков при размере входных данных 4 Кбайт.&lt;br /&gt;
40kb.jpg|Зависимость времени сортировки от количества потоков при размере входных данных 40 Кбайт.&lt;br /&gt;
400kb.jpg|Зависимость времени сортировки от количества потоков при размере входных данных 400 Кбайт.&lt;br /&gt;
4mb.jpg|Зависимость времени сортировки от количества потоков при размере входных данных 4 Мбайт.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:4mb.png&amp;diff=29590</id>
		<title>Файл:4mb.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:4mb.png&amp;diff=29590"/>
		<updated>2023-12-05T18:25:07Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;4mb&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:400kb.png&amp;diff=29589</id>
		<title>Файл:400kb.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:400kb.png&amp;diff=29589"/>
		<updated>2023-12-05T18:24:44Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;400kb&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:40kb.png&amp;diff=29588</id>
		<title>Файл:40kb.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:40kb.png&amp;diff=29588"/>
		<updated>2023-12-05T18:24:20Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;40kb&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:4kb.png&amp;diff=29587</id>
		<title>Файл:4kb.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:4kb.png&amp;diff=29587"/>
		<updated>2023-12-05T18:23:53Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;4kb&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29586</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29586"/>
		<updated>2023-12-05T18:16:49Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
Информационный граф состоит из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; итераций, где разбиение элементов на пары начинается с нулевого элемента на каждой четной начинается, а на каждой нечетной с первого. Каждую такую пару может обрабатывать отдельный поток, независимо от других.&lt;br /&gt;
[[Файл:Информационный граф1.png|мини|Рис 1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
Это можно увидеть на примере, который изображен на рис. 2&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg|мини|Рис 2. Пример с массивом размера 6, количеством потоков 3]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(1)&amp;lt;/math&amp;gt;, а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29585</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29585"/>
		<updated>2023-12-05T18:10:12Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
[[Файл:Информационный граф1.png|мини|Рис 1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg|мини|Рис 2. Пример с массивом размера 6, количеством потоков 3]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(1)&amp;lt;/math&amp;gt;, а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29584</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29584"/>
		<updated>2023-12-05T18:09:32Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
[[Файл:Информационный граф1.png|мини|Рис 1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(1)&amp;lt;/math&amp;gt;, а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[Файл:Example.jpg|мини|Рис 2. Пример с массивом размера 6, количеством потоков 3]]&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Example.jpg&amp;diff=29583</id>
		<title>Файл:Example.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Example.jpg&amp;diff=29583"/>
		<updated>2023-12-05T18:08:26Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29582</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29582"/>
		<updated>2023-12-05T18:06:21Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
[[Файл:Информационный граф1.png|мини|Рис 1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(1)&amp;lt;/math&amp;gt;, а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%841.png&amp;diff=29581</id>
		<title>Файл:Информационный граф1.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%841.png&amp;diff=29581"/>
		<updated>2023-12-05T18:04:56Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;INFO&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29580</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29580"/>
		<updated>2023-12-05T17:58:16Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
[[Файл:Infograph2.jpg|мини|Рис.1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(1)&amp;lt;/math&amp;gt;, а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29579</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29579"/>
		<updated>2023-12-05T17:57:42Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
[[Файл:Infograph2.jpg|мини|Рис.1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность О(1), а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет О(n).&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29578</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29578"/>
		<updated>2023-12-05T17:56:53Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
[[Файл:Infograph2.jpg|мини|Рис.1. Информационный граф алгоритма сортировки пузырьком]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность О(1), а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет О(n).&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
[[Файл:ParBubble2.png|мини|подпись]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29577</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29577"/>
		<updated>2023-12-05T17:55:15Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
[[Файл:Infograph2.jpg|мини|info]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность О(1), а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет О(n).&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
[[Файл:ParBubble2.png|мини|подпись]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Infograph2.jpg&amp;diff=29576</id>
		<title>Файл:Infograph2.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Infograph2.jpg&amp;diff=29576"/>
		<updated>2023-12-05T17:54:54Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;info&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29575</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29575"/>
		<updated>2023-12-05T17:53:28Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&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;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность О(1), а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет О(n).&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
[[Файл:ParBubble2.png|мини|подпись]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29574</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29574"/>
		<updated>2023-12-05T17:53:11Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(n^2)&amp;lt;/math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность О(1), а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет О(n).&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
[[Файл:ParBubble2.png|мини|подпись]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29573</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29573"/>
		<updated>2023-12-05T17:52:27Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки. Дополнительные функции не использутся.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&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;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность О(1), а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет О(n).&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
[[Файл:ParBubble2.png|мини|подпись]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29572</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29572"/>
		<updated>2023-12-05T17:51:10Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&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;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность О(1), а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет О(n).&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\frac{n^2}{p})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
[[Файл:ParBubble2.png|мини|подпись]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29571</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29571"/>
		<updated>2023-12-05T17:49:27Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги: Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;. Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами. После первого прохода самый большой элемент окажется в конце списка. Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов. Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&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;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность О(1), а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет О(n).&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится &amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\Theta(\n^2/p)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
[[Файл:ParBubble2.png|мини|подпись]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29558</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29558"/>
		<updated>2023-12-05T12:56:47Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 • Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&lt;br /&gt;
 • Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&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;
Ресурсом параллелизма в данном алгоритме является возможность независимого выполнения операций сравнения двух соседних элементов и последующего обмена этих элементов. Эти вызовы обрабатывают разные части данных и не зависят друг от друга, что позволяет выполнять их одновременно на разных потоках.&lt;br /&gt;
&lt;br /&gt;
В параллельной версии сортировки пузырьком мы каждую пару последовательно стоящих в массиве элементов подаем на отдельный поток. Это означает, что в идеальном случае (количество потоков неограниченно, затраты на создание потоков и синхронизацию между ними игнорируются) операции сравнения и замены индексов могут выполняться одновременно. Таким образом каждый шаг сортировки имеет временную сложность О(1), а максимальное время, необходимое для сортировки, будет n, соответственно временная сложность будет О(n).&lt;br /&gt;
&lt;br /&gt;
Но на практике, когда ресурсы ограничены, получается, что при количестве потоков равном p, временная сложность становится o(n^2/p).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
[[Файл:ParBubble2.png|мини|подпись]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ParBubble2.png&amp;diff=29557</id>
		<title>Файл:ParBubble2.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ParBubble2.png&amp;diff=29557"/>
		<updated>2023-12-05T12:55:42Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример.&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29556</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29556"/>
		<updated>2023-12-05T12:46:33Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 • Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&lt;br /&gt;
 • Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&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;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29555</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29555"/>
		<updated>2023-12-05T12:43:57Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 • Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&lt;br /&gt;
 • Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - o(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив произвольного размера &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29554</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29554"/>
		<updated>2023-12-05T12:42:10Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 • Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&lt;br /&gt;
 • Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - o(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив размера n&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Посмотрим на некоторые существующие улучшения последовательной сортировки пузырьком.&lt;br /&gt;
&lt;br /&gt;
1) Реализация с проверкой обмена.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n)&lt;br /&gt;
{&lt;br /&gt;
    int i, j;&lt;br /&gt;
    bool swapped;&lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++) &lt;br /&gt;
    {&lt;br /&gt;
        swapped = false;&lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
            {&lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
                swapped = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (swapped == false)&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данной реализации прирост скорости выполнения происходит за счет введения переменной swapped, и проверки ее значения. Конечно не во всех ситуациях, но некоторых массивах данный вариант будет работать быстрее.&lt;br /&gt;
&lt;br /&gt;
2) Четная - нечетная сортировка&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void oddEvenBubbleSort(int *arr, int n, int threadsNumber) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++) &lt;br /&gt;
    { &lt;br /&gt;
        int first = i % 2;&lt;br /&gt;
&lt;br /&gt;
        for (j = first; j &amp;lt; n - 1; j+=2) &lt;br /&gt;
        {&lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]);&lt;br /&gt;
        } &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
Этот вариант сортировки на случайно заполненных массивах показывал лучшее время из вышеупомянутых. Но главное его преимущество в том, данный алгоритм удобнее всего распараллеливать.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ParBubble.png&amp;diff=29553</id>
		<title>Файл:ParBubble.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ParBubble.png&amp;diff=29553"/>
		<updated>2023-12-05T11:04:44Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример. Параллельная сортировка пузырьком.&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29552</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29552"/>
		<updated>2023-12-05T10:39:02Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как &amp;lt;math&amp;gt;A[0], A[1], ..., A[n-1]&amp;lt;/math&amp;gt;. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса &amp;lt;math&amp;gt;i = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 • Для каждого &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 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+1]&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;A[i] &amp;gt; A[i+1]&amp;lt;/math&amp;gt;, меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&lt;br /&gt;
 • Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - o(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив размера n&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29423</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29423"/>
		<updated>2023-11-22T15:56:27Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как A[0], A[1], ..., A[n-1]. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса i = 0.&lt;br /&gt;
 • Для каждого i от 0 до n-1, сравниваем A[i] и A[i+1]. Если A[i] &amp;gt; A[i+1], меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&lt;br /&gt;
 • Продолжаем выполнять проходы до тех пор, пока список не станет отсортированным.&lt;br /&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;
===Макроструктура алгоритма===&lt;br /&gt;
Как и было сказано выше, основную часть метода занимают сравнения и перестановки.&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
Реализация последовательного алгоритма на языке c++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void bubbleSort(int arr[], int n) &lt;br /&gt;
{ &lt;br /&gt;
    int i, j; &lt;br /&gt;
    for (i = 0; i &amp;lt; n - 1; i++)  &lt;br /&gt;
        for (j = 0; j &amp;lt; n - i - 1; j++) &lt;br /&gt;
            if (arr[j] &amp;gt; arr[j + 1]) &lt;br /&gt;
                swap(arr[j], arr[j + 1]); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Относится к алгоритмам с квадратичной сложностью - o(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив размера n&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29402</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29402"/>
		<updated>2023-11-08T15:35:28Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как A[0], A[1], ..., A[n-1]. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса i = 0.&lt;br /&gt;
 • Для каждого i от 0 до n-1, сравниваем A[i] и A[i+1]. Если A[i] &amp;gt; A[i+1], меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив размера n&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29401</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29401"/>
		<updated>2023-11-08T15:33:27Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка, как пузырьки воды во время вспенивания.&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как A[0], A[1], ..., A[n-1]. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса i = 0.&lt;br /&gt;
 • Для каждого i от 0 до n-1, сравниваем A[i] и A[i+1]. Если A[i] &amp;gt; A[i+1], меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Произвольный массив размера n&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Тот же самый массив, но уже отсортированный&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;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29400</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29400"/>
		<updated>2023-11-08T15:22:15Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка, как пузырьки воды во время вспенивания.&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как A[0], A[1], ..., A[n-1]. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса i = 0.&lt;br /&gt;
 • Для каждого i от 0 до n-1, сравниваем A[i] и A[i+1]. Если A[i] &amp;gt; A[i+1], меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&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;
===Свойства алгоритма===&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;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* Левитин А. В. Глава 3. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29393</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29393"/>
		<updated>2023-10-31T16:57:12Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка, как пузырьки воды во время вспенивания.&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как A[0], A[1], ..., A[n-1]. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса i = 0.&lt;br /&gt;
 • Для каждого i от 0 до n-1, сравниваем A[i] и A[i+1]. Если A[i] &amp;gt; A[i+1], меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&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;
===Свойства алгоритма===&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. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9&lt;br /&gt;
* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29392</id>
		<title>Участник:Alexeyshekhanov/Сортировка пузырьком</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexeyshekhanov/%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=29392"/>
		<updated>2023-10-31T16:56:33Z</updated>

		<summary type="html">&lt;p&gt;Alexeyshekhanov: добавлено описание последовательной реализации&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сортировка пузырьком&lt;br /&gt;
==  Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Сортировка пузырьком — это алгоритм сортировки, который последовательно проходит по списку, сравнивает пары соседних элементов и меняет их местами, если они стоят в неправильном порядке. Этот процесс продолжается до тех пор, пока весь список не будет отсортирован. Название &amp;quot;пузырьком&amp;quot; происходит от того, что наибольшие элементы &amp;quot;всплывают&amp;quot; к концу списка, как пузырьки воды во время вспенивания.&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Давайте представим список из n элементов, обозначим его как A[0], A[1], ..., A[n-1]. Сортировка пузырьком выполняет следующие шаги:&lt;br /&gt;
 • Начнем с индекса i = 0.&lt;br /&gt;
 • Для каждого i от 0 до n-1, сравниваем A[i] и A[i+1]. Если A[i] &amp;gt; A[i+1], меняем их местами.&lt;br /&gt;
 • После первого прохода самый большой элемент окажется в конце списка.&lt;br /&gt;
 • Уменьшаем n на 1 и повторяем шаги 1 и 2 для оставшихся элементов.&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;
===Свойства алгоритма===&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. Метод грубой силы: Пузырьковая сортировка // Алгоритмы. Введение в разработку и анализ — М.: Вильямс, 2006. — С. 144—146. — 576 с. — ISBN 978-5-8459-0987-9* Абрамов С. А., Лекции о сложности алгоритмов. — М.: МЦНМО, 2009. - 256 с. - ISBN 978-5-94057-433-0&lt;/div&gt;</summary>
		<author><name>Alexeyshekhanov</name></author>
	</entry>
</feed>