<?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=%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0+%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F</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=%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0+%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F"/>
	<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/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F"/>
	<updated>2026-10-22T18:43:15Z</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29551</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29551"/>
		<updated>2023-12-05T08:37:24Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Graph bitonic.png|500px|thumb|center|рис.1: Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображена работа битонной сортировки. Красные элементы соответствуют возрастающей последовательности, зеленые – убывающей. Операции min и max соответствуют операциям сравнения двух чисел и, при необходимости, обмену местами двух чисел. Можно заметить, что работу алгоритма можно представить в виде выполнения двух шагов: создание битонных последовательностей и их слияние.&lt;br /&gt;
&lt;br /&gt;
[[Файл:BitonicSort1.svg|700px|thumb|center|рис.2: Битонная сортировка для 16 элементов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 изображена битонная сортировочная сеть для 16 элементов, которая сортирует множество по возрастанию. Красные прямоугольники скомбинированы в зеленые и голубые прямоугольники. В синих прямоугольниках стрелки компараторов направлены вниз (создают возрастающие последовательности), в зеленых — вверх (создают убывающие последовательности). Каждый из таких прямоугольников имеет одинаковую структуру: красный прямоугольник применяется ко всей последовательности, затем к каждой половине полученных результатов и так далее. Если на входы такого прямоугольника подается битонная последовательность, то на выходе она преобразуется в полностью отсортированную. Объединенные результаты синего и зеленого прямоугольника является битонной последовательностью.&lt;br /&gt;
Каждый столбец синих и зеленых прямоугольников принимает N отсортированных последовательностей (на самом первом шаге 16 отсортированных последовательностей, состоящих из 1 элемента) и преобразует их в N/2 отсортированных последовательностей. &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bitonic sort.svg|thumb|center|700px|рис.3: Битонная сортировочная сеть]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Наиболее используемый &amp;quot;классический&amp;quot; вариант битонной сортировки предложен [https://www.geeksforgeeks.org/bitonic-sort/ GeeksforGeeks]. Здесь его реализации предложены на языках C++, Java, Python3, C#, Javascript. Время работы составляет [math] O(log^2n) [/math], объем занимаемой памяти [math] O(nlogn) [/math]. Авторы отмечают, что у алгоритма число сравнений больше, чем у других сортировок.&lt;br /&gt;
&lt;br /&gt;
Также реализация битонной сортировки предложена на сайте [https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Parallel Computing]. Здесь данная сортировка реализована в трех вариантах с использованием технологий MPI, OpenMP и Cuda.&lt;br /&gt;
&lt;br /&gt;
В статье [https://ieeexplore.ieee.org/document/16506 K-Way Bitonic Sort] предложена модификация битонной сортировки, позволяющая более эффективно сортировать последовательности произвольной размерности.&lt;br /&gt;
&lt;br /&gt;
На сайте [https://www.sortvisualizer.com/bitonicsort/ Sort Visualizer] предложена визуализация работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29550</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29550"/>
		<updated>2023-12-05T08:36:54Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Graph bitonic.png|500px|thumb|center|рис.1: Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображена работа битонной сортировки. Красные элементы соответствуют возрастающей последовательности, зеленые – убывающей. Операции min и max соответствуют операциям сравнения двух чисел и, при необходимости, обмену местами двух чисел. Можно заметить, что работу алгоритма можно представить в виде выполнения двух шагов: создание битонных последовательностей и их слияние.&lt;br /&gt;
&lt;br /&gt;
[[Файл:BitonicSort1.svg|500px|thumb|center|рис.2: Битонная сортировка для 16 элементов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 изображена битонная сортировочная сеть для 16 элементов, которая сортирует множество по возрастанию. Красные прямоугольники скомбинированы в зеленые и голубые прямоугольники. В синих прямоугольниках стрелки компараторов направлены вниз (создают возрастающие последовательности), в зеленых — вверх (создают убывающие последовательности). Каждый из таких прямоугольников имеет одинаковую структуру: красный прямоугольник применяется ко всей последовательности, затем к каждой половине полученных результатов и так далее. Если на входы такого прямоугольника подается битонная последовательность, то на выходе она преобразуется в полностью отсортированную. Объединенные результаты синего и зеленого прямоугольника является битонной последовательностью.&lt;br /&gt;
Каждый столбец синих и зеленых прямоугольников принимает N отсортированных последовательностей (на самом первом шаге 16 отсортированных последовательностей, состоящих из 1 элемента) и преобразует их в N/2 отсортированных последовательностей. &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bitonic sort.svg|thumb|center|700px|рис.3: Битонная сортировочная сеть]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 3 каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Наиболее используемый &amp;quot;классический&amp;quot; вариант битонной сортировки предложен [https://www.geeksforgeeks.org/bitonic-sort/ GeeksforGeeks]. Здесь его реализации предложены на языках C++, Java, Python3, C#, Javascript. Время работы составляет [math] O(log^2n) [/math], объем занимаемой памяти [math] O(nlogn) [/math]. Авторы отмечают, что у алгоритма число сравнений больше, чем у других сортировок.&lt;br /&gt;
&lt;br /&gt;
Также реализация битонной сортировки предложена на сайте [https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Parallel Computing]. Здесь данная сортировка реализована в трех вариантах с использованием технологий MPI, OpenMP и Cuda.&lt;br /&gt;
&lt;br /&gt;
В статье [https://ieeexplore.ieee.org/document/16506 K-Way Bitonic Sort] предложена модификация битонной сортировки, позволяющая более эффективно сортировать последовательности произвольной размерности.&lt;br /&gt;
&lt;br /&gt;
На сайте [https://www.sortvisualizer.com/bitonicsort/ Sort Visualizer] предложена визуализация работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29549</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29549"/>
		<updated>2023-12-05T08:35:08Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Graph bitonic.png|500px|thumb|center|рис.1: Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображена работа битонной сортировки. Красные элементы соответствуют возрастающей последовательности, зеленые – убывающей. Операции min и max соответствуют операциям сравнения двух чисел и, при необходимости, обмену местами двух чисел. Можно заметить, что работу алгоритма можно представить в виде выполнения двух шагов: создание битонных последовательностей и их слияние.&lt;br /&gt;
&lt;br /&gt;
[[Файл:BitonicSort1.svg|500px|thumb|center|рис.2: Битонная сортировка для 16 элементов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 изображена битонная сортировочная сеть для 16 элементов, которая сортирует множество по возрастанию. Красные прямоугольники скомбинированы в зеленые и голубые прямоугольники. В синих прямоугольниках стрелки компараторов направлены вниз (создают возрастающие последовательности), в зеленых — вверх (создают убывающие последовательности). Каждый из таких прямоугольников имеет одинаковую структуру: красный прямоугольник применяется ко всей последовательности, затем к каждой половине полученных результатов и так далее. Если на входы такого прямоугольника подается битонная последовательность, то на выходе она преобразуется в полностью отсортированную. Объединенные результаты синего и зеленого прямоугольника является битонной последовательностью.&lt;br /&gt;
Каждый столбец синих и зеленых прямоугольников принимает N отсортированных последовательностей (на самом первом шаге 16 отсортированных последовательностей, состоящих из 1 элемента) и преобразует их в N/2 отсортированных последовательностей. &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|рис.3: Битонная сортировочная сеть]]&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
На диаграмме 3 каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Наиболее используемый &amp;quot;классический&amp;quot; вариант битонной сортировки предложен [https://www.geeksforgeeks.org/bitonic-sort/ GeeksforGeeks]. Здесь его реализации предложены на языках C++, Java, Python3, C#, Javascript. Время работы составляет [math] O(log^2n) [/math], объем занимаемой памяти [math] O(nlogn) [/math]. Авторы отмечают, что у алгоритма число сравнений больше, чем у других сортировок.&lt;br /&gt;
&lt;br /&gt;
Также реализация битонной сортировки предложена на сайте [https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Parallel Computing]. Здесь данная сортировка реализована в трех вариантах с использованием технологий MPI, OpenMP и Cuda.&lt;br /&gt;
&lt;br /&gt;
В статье [https://ieeexplore.ieee.org/document/16506 K-Way Bitonic Sort] предложена модификация битонной сортировки, позволяющая более эффективно сортировать последовательности произвольной размерности.&lt;br /&gt;
&lt;br /&gt;
На сайте [https://www.sortvisualizer.com/bitonicsort/ Sort Visualizer] предложена визуализация работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29527</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29527"/>
		<updated>2023-12-04T18:31:58Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Graph bitonic.png|мини|рис.1: Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображена работа битонной сортировки. Красные элементы соответствуют возрастающей последовательности, зеленые – убывающей. Операции min и max соответствуют операциям сравнения двух чисел и, при необходимости, обмену местами двух чисел. Можно заметить, что работу алгоритма можно представить в виде выполнения двух шагов: создание битонных последовательностей и их слияние.&lt;br /&gt;
&lt;br /&gt;
[[Файл:BitonicSort1.svg|без|рис.2: Битонная сортировка для 16 элементов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 изображена битонная сортировочная сеть для 16 элементов, которая сортирует множество по возрастанию. Красные прямоугольники скомбинированы в зеленые и голубые прямоугольники. В синих прямоугольниках стрелки компараторов направлены вниз (создают возрастающие последовательности), в зеленых — вверх (создают убывающие последовательности). Каждый из таких прямоугольников имеет одинаковую структуру: красный прямоугольник применяется ко всей последовательности, затем к каждой половине полученных результатов и так далее. Если на входы такого прямоугольника подается битонная последовательность, то на выходе она преобразуется в полностью отсортированную. Объединенные результаты синего и зеленого прямоугольника является битонной последовательностью.&lt;br /&gt;
Каждый столбец синих и зеленых прямоугольников принимает N отсортированных последовательностей (на самом первом шаге 16 отсортированных последовательностей, состоящих из 1 элемента) и преобразует их в N/2 отсортированных последовательностей. &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|рис.3: Битонная сортировочная сеть]]&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
На диаграмме 3 каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Наиболее используемый &amp;quot;классический&amp;quot; вариант битонной сортировки предложен [https://www.geeksforgeeks.org/bitonic-sort/ GeeksforGeeks]. Здесь его реализации предложены на языках C++, Java, Python3, C#, Javascript. Время работы составляет [math] O(log^2n) [/math], объем занимаемой памяти [math] O(nlogn) [/math]. Авторы отмечают, что у алгоритма число сравнений больше, чем у других сортировок.&lt;br /&gt;
&lt;br /&gt;
Также реализация битонной сортировки предложена на сайте [https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Parallel Computing]. Здесь данная сортировка реализована в трех вариантах с использованием технологий MPI, OpenMP и Cuda.&lt;br /&gt;
&lt;br /&gt;
В статье [https://ieeexplore.ieee.org/document/16506 K-Way Bitonic Sort] предложена модификация битонной сортировки, позволяющая более эффективно сортировать последовательности произвольной размерности.&lt;br /&gt;
&lt;br /&gt;
На сайте [https://www.sortvisualizer.com/bitonicsort/ Sort Visualizer] предложена визуализация работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29526</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29526"/>
		<updated>2023-12-04T18:30:27Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Graph bitonic.png|мини|рис.1: Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображена работа битонной сортировки. Красные элементы соответствуют возрастающей последовательности, зеленые – убывающей. Операции min и max соответствуют операциям сравнения двух чисел и, при необходимости, обмену местами двух чисел. Можно заметить, что работу алгоритма можно представить в виде выполнения двух шагов: создание битонных последовательностей и их слияние.&lt;br /&gt;
&lt;br /&gt;
[[Файл:BitonicSort1.svg|мини|рис.2: Битонная сортировка для 16 элементов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 изображена битонная сортировочная сеть для 16 элементов, которая сортирует множество по возрастанию. Красные прямоугольники скомбинированы в зеленые и голубые прямоугольники. В синих прямоугольниках стрелки компараторов направлены вниз (создают возрастающие последовательности), в зеленых — вверх (создают убывающие последовательности). Каждый из таких прямоугольников имеет одинаковую структуру: красный прямоугольник применяется ко всей последовательности, затем к каждой половине полученных результатов и так далее. Если на входы такого прямоугольника подается битонная последовательность, то на выходе она преобразуется в полностью отсортированную. Объединенные результаты синего и зеленого прямоугольника является битонной последовательностью.&lt;br /&gt;
Каждый столбец синих и зеленых прямоугольников принимает N отсортированных последовательностей (на самом первом шаге 16 отсортированных последовательностей, состоящих из 1 элемента) и преобразует их в N/2 отсортированных последовательностей. &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|рис.3: Битонная сортировочная сеть]]&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
На диаграмме 3 каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Наиболее используемый &amp;quot;классический&amp;quot; вариант битонной сортировки предложен [https://www.geeksforgeeks.org/bitonic-sort/ GeeksforGeeks]. Здесь его реализации предложены на языках C++, Java, Python3, C#, Javascript. Время работы составляет [math] O(log^2n) [/math], объем занимаемой памяти [math] O(nlogn) [/math]. Авторы отмечают, что у алгоритма число сравнений больше, чем у других сортировок.&lt;br /&gt;
&lt;br /&gt;
Также реализация битонной сортировки предложена на сайте [https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Parallel Computing]. Здесь данная сортировка реализована в трех вариантах с использованием технологий MPI, OpenMP и Cuda.&lt;br /&gt;
&lt;br /&gt;
В статье [https://ieeexplore.ieee.org/document/16506 K-Way Bitonic Sort] предложена модификация битонной сортировки, позволяющая более эффективно сортировать последовательности произвольной размерности.&lt;br /&gt;
&lt;br /&gt;
На сайте [https://www.sortvisualizer.com/bitonicsort/ Sort Visualizer] предложена визуализация работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29525</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29525"/>
		<updated>2023-12-04T18:29:50Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Graph bitonic.png|мини|рис.1: Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображена работа битонной сортировки. Красные элементы соответствуют возрастающей последовательности, зеленые – убывающей. Операции min и max соответствуют операциям сравнения двух чисел и, при необходимости, обмену местами двух чисел. Можно заметить, что работу алгоритма можно представить в виде выполнения двух шагов: создание битонных последовательностей и их слияние.&lt;br /&gt;
&lt;br /&gt;
[[Файл:BitonicSort1.svg|мини|рис.2: Битонная сортировка для 16 элементов]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 изображена битонная сортировочная сеть для 16 элементов, которая сортирует множество по возрастанию. Красные прямоугольники скомбинированы в зеленые и голубые прямоугольники. В синих прямоугольниках стрелки компараторов направлены вниз (создают возрастающие последовательности), в зеленых — вверх (создают убывающие последовательности). Каждый из таких прямоугольников имеет одинаковую структуру: красный прямоугольник применяется ко всей последовательности, затем к каждой половине полученных результатов и так далее. Если на входы такого прямоугольника подается битонная последовательность, то на выходе она преобразуется в полностью отсортированную. Объединенные результаты синего и зеленого прямоугольника является битонной последовательностью.&lt;br /&gt;
Каждый столбец синих и зеленых прямоугольников принимает N отсортированных последовательностей (на самом первом шаге 16 отсортированных последовательностей, состоящих из 1 элемента) и преобразует их в N/2 отсортированных последовательностей. &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Битонная сортировочная сеть]]&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Наиболее используемый &amp;quot;классический&amp;quot; вариант битонной сортировки предложен [https://www.geeksforgeeks.org/bitonic-sort/ GeeksforGeeks]. Здесь его реализации предложены на языках C++, Java, Python3, C#, Javascript. Время работы составляет [math] O(log^2n) [/math], объем занимаемой памяти [math] O(nlogn) [/math]. Авторы отмечают, что у алгоритма число сравнений больше, чем у других сортировок.&lt;br /&gt;
&lt;br /&gt;
Также реализация битонной сортировки предложена на сайте [https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Parallel Computing]. Здесь данная сортировка реализована в трех вариантах с использованием технологий MPI, OpenMP и Cuda.&lt;br /&gt;
&lt;br /&gt;
В статье [https://ieeexplore.ieee.org/document/16506 K-Way Bitonic Sort] предложена модификация битонной сортировки, позволяющая более эффективно сортировать последовательности произвольной размерности.&lt;br /&gt;
&lt;br /&gt;
На сайте [https://www.sortvisualizer.com/bitonicsort/ Sort Visualizer] предложена визуализация работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29524</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29524"/>
		<updated>2023-12-04T18:20:51Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Graph bitonic.png|мини|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
На рисунке изображена работа битонной сортировки. Красные элементы соответствуют возрастающей последовательности, зеленые – убывающей. Операции min и max соответствуют операциям сравнения двух чисел и, при необходимости, обмену местами двух чисел. Можно заметить, что работу алгоритма можно представить в виде выполнения двух шагов: создание битонных последовательностей и их слияние.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Битонная сортировочная сеть]]&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Наиболее используемый &amp;quot;классический&amp;quot; вариант битонной сортировки предложен [https://www.geeksforgeeks.org/bitonic-sort/ GeeksforGeeks]. Здесь его реализации предложены на языках C++, Java, Python3, C#, Javascript. Время работы составляет [math] O(log^2n) [/math], объем занимаемой памяти [math] O(nlogn) [/math]. Авторы отмечают, что у алгоритма число сравнений больше, чем у других сортировок.&lt;br /&gt;
&lt;br /&gt;
Также реализация битонной сортировки предложена на сайте [https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Parallel Computing]. Здесь данная сортировка реализована в трех вариантах с использованием технологий MPI, OpenMP и Cuda.&lt;br /&gt;
&lt;br /&gt;
В статье [https://ieeexplore.ieee.org/document/16506 K-Way Bitonic Sort] предложена модификация битонной сортировки, позволяющая более эффективно сортировать последовательности произвольной размерности.&lt;br /&gt;
&lt;br /&gt;
На сайте [https://www.sortvisualizer.com/bitonicsort/ Sort Visualizer] предложена визуализация работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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:Graph_bitonic.png&amp;diff=29523</id>
		<title>Файл:Graph bitonic.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:Graph_bitonic.png&amp;diff=29523"/>
		<updated>2023-12-04T18:16:58Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29508</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29508"/>
		<updated>2023-12-04T17:06:12Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Наиболее используемый &amp;quot;классический&amp;quot; вариант битонной сортировки предложен [https://www.geeksforgeeks.org/bitonic-sort/ GeeksforGeeks]. Здесь его реализации предложены на языках C++, Java, Python3, C#, Javascript. Время работы составляет [math] O(log^2n) [/math], объем занимаемой памяти [math] O(nlogn) [/math]. Авторы отмечают, что у алгоритма число сравнений больше, чем у других сортировок.&lt;br /&gt;
&lt;br /&gt;
Также реализация битонной сортировки предложена на сайте [https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Parallel Computing]. Здесь данная сортировка реализована в трех вариантах с использованием технологий MPI, OpenMP и Cuda.&lt;br /&gt;
&lt;br /&gt;
В статье [https://ieeexplore.ieee.org/document/16506 K-Way Bitonic Sort] предложена модификация битонной сортировки, позволяющая более эффективно сортировать последовательности произвольной размерности.&lt;br /&gt;
&lt;br /&gt;
На сайте [https://www.sortvisualizer.com/bitonicsort/ Sort Visualizer] предложена визуализация работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29487</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29487"/>
		<updated>2023-12-03T15:51:07Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Наиболее используемый &amp;quot;классический&amp;quot; вариант битонной сортировки предложен [https://www.geeksforgeeks.org/bitonic-sort/ GeeksforGeeks]. Здесь его реализации предложены на языках C++, Java, Python3, C#, Javascript. Время работы составляет [math] O(log^2n) [/math], объем занимаемой памяти [math] O(nlogn) [/math]. Авторы отмечают, что у алгоритма число сравнений больше, чем у других сортировок.&lt;br /&gt;
&lt;br /&gt;
Также реализация битонной сортировки предложена на сайте [https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Parallel Computing]. Здесь данная сортировка реализована в трех вариантах с использованием технологий MPI, OpenMP и Cuda.&lt;br /&gt;
&lt;br /&gt;
В статье [https://ieeexplore.ieee.org/document/16506 K-Way Bitonic Sort] предложена модификация битонной сортировки, позволяющая более эффективно сортировать последовательности произвольной размерности.&lt;br /&gt;
&lt;br /&gt;
На сайте [https://www.sortvisualizer.com/bitonicsort/ Sort Visualizer] предложена визуализация работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29458</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29458"/>
		<updated>2023-12-03T12:22:54Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
[https://www.geeksforgeeks.org/bitonic-sort/ Реализация битонной сортировки от GeeksforGeeks]&lt;br /&gt;
&lt;br /&gt;
[https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Реализация битонной сортировки, найденная на сайте Parallel Computing]&lt;br /&gt;
&lt;br /&gt;
[https://www.sortvisualizer.com/bitonicsort/ Реализация битонной сортировки с красивым интерфейсом сайта, где можно наглядно увидеть как работает последовательный алгоритм сортировки]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29446</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29446"/>
		<updated>2023-12-02T14:48:54Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
[https://www.geeksforgeeks.org/bitonic-sort/ Реализация битонной сортировки от GeeksforGeeks]&lt;br /&gt;
&lt;br /&gt;
[https://people.cs.rutgers.edu/~venugopa/parallel_summer2012/bitonic_openmp.html Реализация битонной сортировки, найденная на сайте Parallel Computing]&lt;br /&gt;
&lt;br /&gt;
[https://www.sortvisualizer.com/bitonicsort/ Реализация битонной сортировки с красивым интерфейсом сайта, где можно наглядно увидеть как работает последовательный алгоритм сортировки]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29445</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29445"/>
		<updated>2023-12-02T14:26:19Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Уменьшения времени выполнения можно добиться за счет увеличения количества MPI процессов, но следует помнить о накладных расходах на создание процессов и обмен сообщениями между ними. Для очень больших длин сортируемого массива можно использовать большое число процессов, но если массив сравнительно небольшой, то затраты на использование большого количества MPI процессов не будут оправданы.&lt;br /&gt;
&lt;br /&gt;
На графике приведена зависимость времени работы алгоритма от числа процессов и длины сортируемого массива. Видно, что при увеличении длины массива время выполнения растет, но чем больше процессов используется, тем медленнее растет время выполнения.&lt;br /&gt;
&lt;br /&gt;
Реализованный алгоритм запускался на суперкомпьютере Ломоносов 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.png|мини|центр|Зависимость времени работы алгоритма от длины массива и количества MPI процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29444</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29444"/>
		<updated>2023-12-02T14:20:17Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов являющееся степенью числа 2. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%97%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%BE%D1%82_%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D0%B8_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D0%B2.png&amp;diff=29443</id>
		<title>Файл:Зависимость времени работы алгоритма от длины массива и количества процессов.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%97%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%BE%D1%82_%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D0%B8_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D0%B2.png&amp;diff=29443"/>
		<updated>2023-12-02T14:16:21Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Зависимость времени работы алгоритма от длины массива и количества процессов&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29442</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29442"/>
		<updated>2023-12-02T14:12:12Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов кратное двум. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Временная сложность алгоритма:&lt;br /&gt;
* При последовательной реализации &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* При параллельной реализации &amp;lt;math&amp;gt;O(log^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование памяти:&lt;br /&gt;
* Для последовательной реализации в худшем случае &amp;lt;math&amp;gt;O(nlog^2(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* В случае использования параллелизма количество памяти зависит от реализации&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Не очень сложно реализуется для случая использования параллелизма&lt;br /&gt;
* Более эффективен, чем алгоритм быстрой сортировки&lt;br /&gt;
&lt;br /&gt;
Недостатки:&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29441</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29441"/>
		<updated>2023-12-02T14:02:20Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов кратное двум. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29440</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29440"/>
		<updated>2023-12-02T13:59:25Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм дает большой выигрыш при использовании параллелизма. В общем случае можно распараллелить данный алгоритм на любое число процессов кратное двум. Однако следует учитывать накладные расходы на создание MPI процессов и обмен сообщениями между ними. Если их будет достаточно много для сравнительно небольшой длины массива, то выигрыш в производительности будет очень маленьким, либо может отсутствовать вовсе. &lt;br /&gt;
&lt;br /&gt;
При последовательной реализации каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени, а всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации временная сложность алгоритма гораздо меньше -  &amp;lt;math&amp;gt;O(log^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Зависимость времени выполнения от размера массива и количества процессов.png|обрамить|Зависимость времени выполнения от размера массива и количества процессов]]&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%97%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D1%82_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D0%B8_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D0%B2.png&amp;diff=29439</id>
		<title>Файл:Зависимость времени выполнения от размера массива и количества процессов.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%97%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D1%82_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D0%B8_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D0%B2.png&amp;diff=29439"/>
		<updated>2023-12-02T13:58:22Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Зависимость времени выполнения от размера массива и количества процессов&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29438</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29438"/>
		<updated>2023-12-02T13:39:04Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Bitonic sort.svg|обрамить|Информационный граф битонной сортировки]]&lt;br /&gt;
&lt;br /&gt;
Диаграмма сортировки для 16 сортируемых элементов. &lt;br /&gt;
Горизонтальные линии представляют индексы массива в нашем массиве сортируемых элементов, каждая вертикальная линия представляет один рабочий поток, выполняющий операцию сравнения и замены.&lt;br /&gt;
&lt;br /&gt;
На диаграмме каждый рабочий поток нарисован в виде вертикальной линии, начальная и конечная точки обозначают индексы текущей пары сортируемых элементов. Все цветные блоки, находящиеся в одном столбце, образуют шаг, который можно выполнять параллельно. Из диаграммы видно, что количество потоков на шаг постоянно и всегда равно &amp;lt;math&amp;gt; n/2&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n&amp;lt;/math&amp;gt; — количество сортируемых элементов &amp;lt;ref&amp;gt; Ponies&amp;amp;Light: [https://poniesandlight.co.uk/reflect/bitonic_merge_sort/. Implementing Bitonic Merge Sort in Vulkan Compute] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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:Bitonic_sort.svg&amp;diff=29436</id>
		<title>Файл:Bitonic sort.svg</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:Bitonic_sort.svg&amp;diff=29436"/>
		<updated>2023-12-02T13:32:32Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bitonic sort&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29432</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29432"/>
		<updated>2023-12-02T13:29:13Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность такой реализации &amp;lt;math&amp;gt; O(nlog^2n)&amp;lt;/math&amp;gt; поскольку при построении битонной последовательности мы использовали сортировку, работающую за &amp;lt;math&amp;gt; O(nlogn)&amp;lt;/math&amp;gt;, а всего уровней было &amp;lt;math&amp;gt; logn&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;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29428</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29428"/>
		<updated>2023-12-02T13:19:27Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&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;
Сложность алгоритма битонной сортировки зависит от количества элементов в массиве. Обозначим эту величину как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29399</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29399"/>
		<updated>2023-11-07T11:07:09Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность алгоритма битонной сортировки зависит от количества элементов в массиве. Обозначим эту величину как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29398</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29398"/>
		<updated>2023-11-07T11:06:28Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма битонной сортировки можно представить следующим образом &amp;lt;ref&amp;gt;Ionescu, M.F., &amp;amp; Schauser, K.E. (1990). Optimizing Parallel Bitonic Sort. Department of Computer Science, University of California.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
1. Разбиение исходного массива на битонные последовательности.&lt;br /&gt;
2. Сортировка каждой битонной последовательности в порядке возрастания.&lt;br /&gt;
3. Объединение отсортированных битонных последовательностей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность алгоритма битонной сортировки зависит от количества элементов в массиве. Обозначим эту величину как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29397</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29397"/>
		<updated>2023-11-07T10:41:56Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность алгоритма битонной сортировки зависит от количества элементов в массиве. Обозначим эту величину как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29396</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29396"/>
		<updated>2023-11-07T10:38:46Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность алгоритма битонной сортировки зависит от количества элементов в массиве. Обозначим эту величину как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29395</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29395"/>
		<updated>2023-11-07T10:37:54Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
В данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность алгоритма битонной сортировки зависит от количества элементов в массиве. Обозначим эту величину как &amp;quot;n&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29383</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29383"/>
		<updated>2023-10-30T17:47:22Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Сортировкой, или упорядочиванием элементов, называется процесс их расположения согласно определенному линейному отношению порядка, такому как отношение «меньше или равно» для чисел.&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Выходными данными алгоритма является массив, отсортированный в порядке неубывания или невозрастания.&lt;br /&gt;
&lt;br /&gt;
Решение задачи основано на понятии битонной последовательности. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
Заметим, что в данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность алгоритма битонной сортировки зависит от количества элементов в массиве. Обозначим эту величину как &amp;quot;n&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29382</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29382"/>
		<updated>2023-10-30T17:42:39Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
Заметим, что в данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность алгоритма битонной сортировки зависит от количества элементов в массиве. Обозначим эту величину как &amp;quot;n&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: одномерный массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, &amp;lt;math&amp;gt;|A|=n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: упорядоченный массив &amp;lt;math&amp;gt;B=sort(A)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29347</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29347"/>
		<updated>2023-10-24T11:40:58Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
Заметим, что в данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность алгоритма битонной сортировки зависит от количества элементов в массиве. Обозначим эту величину как &amp;quot;n&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
В каждом шаге рекурсивной сортировки, массив разбивается на две части, и каждая из этих частей сортируется отдельно. Таким образом, каждый шаг рекурсии занимает &amp;lt;math&amp;gt;O(nlog(n))&amp;lt;/math&amp;gt; времени. Всего шагов рекурсии &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;, так как на каждом шаге размер массива уменьшается вдвое. &lt;br /&gt;
&lt;br /&gt;
Таким образом, общая сложность последовательного алгоритма битонной сортировки составляет &amp;lt;math&amp;gt;O(n log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&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;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29346</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29346"/>
		<updated>2023-10-24T11:36:52Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt; (в случае использования параллелизма).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
Заметим, что в данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29345</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29345"/>
		<updated>2023-10-24T11:27:18Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход поступает неотсортированный массив чисел. Исходный массив преобразуется в битонную последовательность. Для этого нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разделим преобразованный массив на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
Заметим, что в данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что, однако, не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29344</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29344"/>
		<updated>2023-10-24T11:02:46Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: Математическое описание алгоритма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на использовании понятия &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход поступает неотсортированный массив чисел. &lt;br /&gt;
&lt;br /&gt;
Чтобы превратить произвольную последовательность в битонную, нужно разделить последовательность пополам, первую часть рекурсивно отсортировать по возрастанию, вторую часть рекурсивно отсортировать по убыванию &amp;lt;ref&amp;gt; Bimlibik: [https://bimlibik.github.io/posts/sorting-algorithm/. Алгоритмы сортировки] &amp;lt;/ref&amp;gt;. &lt;br /&gt;
Исходный массив преобразуется в битонную последовательность. Разделим его на две части: первый массив отсортирован в порядке неубывания, второй в порядке невозрастания. Последовательно сравниваем элементы из двух массивов. Если какой-либо элемент из второго массива окажется меньше соответствующего элемента из первого массива, меняем его местами с элементом из первого массива. В результате в первом массиве окажутся наименьшие элементы из обоих массивов, а во втором - наибольшие. При этом каждый из массивов будет являться битонной последовательностью, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). &lt;br /&gt;
&lt;br /&gt;
Заметим, что в данном алгоритме необходимо, чтобы размер исходного массива был равен степени двойки. В противном случае, его придется дополнять фиктивными элементами, что не влияет не асимптотику &amp;lt;ref&amp;gt; Habr: [https://habr.com/ru/articles/335920/. Описание алгоритмов сортировки и сравнение их производительности] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&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;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29343</id>
		<title>Участница:Полина Кривуля/Сеть битонной сортировки</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%D1%86%D0%B0:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D0%B2%D1%83%D0%BB%D1%8F/%D0%A1%D0%B5%D1%82%D1%8C_%D0%B1%D0%B8%D1%82%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=29343"/>
		<updated>2023-10-23T18:55:35Z</updated>

		<summary type="html">&lt;p&gt;Полина Кривуля: Предварительное общее описание алгоритма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонная сортировка&#039;&#039;&#039; – это параллельный алгоритм сортировки, основанный на &#039;&#039;&#039;битонной последовательности&#039;&#039;&#039;. Алгоритм разработан американским информатиком Кеннетом Бэтчером в 1968 году и является одним из старейших параллельных алгоритмов сортировки. Наряду с четно-нечетной сортировкой слиянием, является одним из первых методов построения сортировочной сети для любого количества входов &amp;lt;ref&amp;gt; Википедия: [https://ru.wikipedia.org/wiki/Битонная_сортировка#:~:text=Битонная%20сортировка%20(англ.,лежит%20понятие%20«битонной%20последовательности». Битонная сортировка] &amp;lt;/ref&amp;gt;. Публикация этого алгоритма, наряду с также предложенным Бэтчером алгоритмом [[сеть нечетно-четной перестановки]], стимулировала развитие проектирования и анализа параллельных алгоритмов в общем и параллельной сортировки в частности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Битонной последовательностью&#039;&#039;&#039; называют последовательность, которая монотонно не убывает, а затем монотонно не возрастает, либо приводится к такому виду в результате циклического сдвига. Пример такой последовательности – {8, 10, 16, 12, 4, -2, -8} &amp;lt;ref&amp;gt; Дальневосточный Федеральный университет: [https://cc.dvfu.ru/ru/lesson-10/ Занятие 10. Программирование на CUDA. Часть 6.] &amp;lt;/ref&amp;gt;.&lt;br /&gt;
Любая последовательность, входящая в битонную, любая последовательность состоящая из одного или двух элементов, а также любая монотонная последовательность также является битонной. Например, последовательности {3,5,10,4,1}, {1,5}, {10,14,5,-1,-4} являются битонными, а {4,6,1,9,2} не является. Каждое множество неотсортированных элементов можно считать множеством битонных последовательностей, состоящих из двух элементов. Процесс битонного слияния преобразует битонную последовательность в полностью отсортированную последовательность. Алгоритм битонной сортировки состоит из применения битонных преобразований до тех пор, пока множество не будет полностью отсортировано &amp;lt;ref&amp;gt; Selim G. Akl. Bitonic Sort (англ.) // Encyclopedia of Parallel Computing : энциклопедия. — Springer, 2011. — P. 139-146. — ISBN 978-0-387-09765-7. &amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма составляет &amp;lt;math&amp;gt; O(log^2(n))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&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;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Полина Кривуля</name></author>
	</entry>
</feed>