<?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=Kiryan</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=Kiryan"/>
	<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/Kiryan"/>
	<updated>2026-10-22T22:57:20Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30080</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30080"/>
		<updated>2025-11-27T07:30:11Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Kiryan|К.Е.Деревянкин]].&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием имеет рекурсивную структуру: исходный массив делится на части, каждая часть сортируется независимо, после чего отсортированные подмассивы последовательно объединяются в единый массив.&lt;br /&gt;
&lt;br /&gt;
Таким образом, максимальный параллелизм достигается на этапе независимых локальных сортировок, а по мере продвижения к этапам слияния количество одновременно выполняющихся процессов уменьшается.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На вход алгоритму подаётся:&lt;br /&gt;
&lt;br /&gt;
* Одномерный массив чисел длиной N, который требуется отсортировать по возрастанию A=[a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​,…,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​]&lt;br /&gt;
* Количество процессов P, участвующих в вычислении&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма формируется отсортированный массив длиной N:&lt;br /&gt;
&lt;br /&gt;
A′ = [a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​, a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​​, a&#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​​, … , a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​], a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​ ​≤ a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​ ​≤ ⋯ ≤ a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​​&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием относится к классу рекурсивных алгоритмов типа «разделяй и властвуй» (divide and conquer).&lt;br /&gt;
Параллельная версия основана на независимой обработке подмножеств данных и их последующем слиянии.&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует параллелизм по данным — каждый процесс сортирует свою часть массива независимо от других.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм сортировки слиянием основан на принципе «разделяй и властвуй» и включает рекурсивное разбиение массива на две части до подмассивов размера 1. На каждом шаге используется вспомогательная память для копирования левой и правой части массива, после чего выполняется операция слияния, работающая за линейное время. Алгоритм является стабильным и полностью детерминированным, а его асимптотическая сложность составляет O(nlogn). Благодаря независимости обработки левого и правого подмассивов данная реализация хорошо подходит для последующей параллелизации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Параллельная реализация сортировки слиянием основана на том, что сортировка левой и правой части массива выполняется независимо, что делает алгоритм естественно распараллеливаемым. Основной принцип параллельной версии заключается в создании отдельных задач (threads или процессов), отвечающих за сортировку подмассивов на различных уровнях рекурсивного дерева.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Результаты выполнения параллельной сортировки слиянием на различных вычислительных платформах&lt;br /&gt;
&lt;br /&gt;
Массив из 100 млн. элементов&lt;br /&gt;
&lt;br /&gt;
Локальный компьютер (8 потоков OpenMP)&lt;br /&gt;
&lt;br /&gt;
Команда: OMP_NUM_THREADS=8 ./mergesort_omp&lt;br /&gt;
&lt;br /&gt;
Результат: 9.01 сек&lt;br /&gt;
&lt;br /&gt;
СК «Ломоносов-2» (8 потоков OpenMP, очередь test)&lt;br /&gt;
&lt;br /&gt;
Команда: sbatch -p test -n 1 --cpus-per-task=8 job_omp_8.sh&lt;br /&gt;
&lt;br /&gt;
Результат: 11.02 сек&lt;br /&gt;
&lt;br /&gt;
Массив из 1 млрд. элементов&lt;br /&gt;
&lt;br /&gt;
Локальный компьютер (8 потоков OpenMP)&lt;br /&gt;
&lt;br /&gt;
Команда: OMP_NUM_THREADS=8 ./mergesort_omp&lt;br /&gt;
&lt;br /&gt;
Результат: не справился с работой&lt;br /&gt;
&lt;br /&gt;
СК «Ломоносов-2» (8 потоков OpenMP, очередь test)&lt;br /&gt;
&lt;br /&gt;
Команда: sbatch -p test -n 1 --cpus-per-task=8 job_omp_8.sh&lt;br /&gt;
&lt;br /&gt;
Результат: 85.9 сек&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости на СК «Ломоносов-2»:&lt;br /&gt;
&lt;br /&gt;
Массив 1 млрд. элементов&lt;br /&gt;
&lt;br /&gt;
1 поток: 213,78 сек&lt;br /&gt;
&lt;br /&gt;
2 потока: 178,246 сек&lt;br /&gt;
&lt;br /&gt;
4 потока: 120,722 сек&lt;br /&gt;
&lt;br /&gt;
8 потоков: 88,04 сек&lt;br /&gt;
&lt;br /&gt;
14 потоков: 73,336 сек&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Сортировка слиянием хорошо масштабируется на MIMD- и гибридных архитектурах благодаря независимому выполнению подзадач. На SIMD-архитектурах её эффективность ограничена, а на SISD работает предсказуемо, но без ускорения. На распределённых системах ключевым фактором становится оптимизация объёма межпроцессных обменов.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30079</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30079"/>
		<updated>2025-11-27T07:28:37Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Kiryan|К.Е.Деревянкин]].&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием имеет рекурсивную структуру: исходный массив делится на части, каждая часть сортируется независимо, после чего отсортированные подмассивы последовательно объединяются в единый массив.&lt;br /&gt;
&lt;br /&gt;
Таким образом, максимальный параллелизм достигается на этапе независимых локальных сортировок, а по мере продвижения к этапам слияния количество одновременно выполняющихся процессов уменьшается.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На вход алгоритму подаётся:&lt;br /&gt;
&lt;br /&gt;
* Одномерный массив чисел длиной N, который требуется отсортировать по возрастанию A=[a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​,…,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​]&lt;br /&gt;
* Количество процессов P, участвующих в вычислении&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма формируется отсортированный массив длиной N:&lt;br /&gt;
&lt;br /&gt;
A′ = [a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​, a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​​, a&#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​​, … , a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​], a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​ ​≤ a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​ ​≤ ⋯ ≤ a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​​&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием относится к классу рекурсивных алгоритмов типа «разделяй и властвуй» (divide and conquer).&lt;br /&gt;
Параллельная версия основана на независимой обработке подмножеств данных и их последующем слиянии.&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует параллелизм по данным — каждый процесс сортирует свою часть массива независимо от других.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм сортировки слиянием основан на принципе «разделяй и властвуй» и включает рекурсивное разбиение массива на две части до подмассивов размера 1. На каждом шаге используется вспомогательная память для копирования левой и правой части массива, после чего выполняется операция слияния, работающая за линейное время. Алгоритм является стабильным и полностью детерминированным, а его асимптотическая сложность составляет O(nlogn). Благодаря независимости обработки левого и правого подмассивов данная реализация хорошо подходит для последующей параллелизации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Параллельная реализация сортировки слиянием основана на том, что сортировка левой и правой части массива выполняется независимо, что делает алгоритм естественно распараллеливаемым. Основной принцип параллельной версии заключается в создании отдельных задач (threads или процессов), отвечающих за сортировку подмассивов на различных уровнях рекурсивного дерева.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Результаты выполнения параллельной сортировки слиянием на различных вычислительных платформах&lt;br /&gt;
Массив из 100 млн. элементов&lt;br /&gt;
Локальный компьютер (8 потоков OpenMP)&lt;br /&gt;
Команда: OMP_NUM_THREADS=8 ./mergesort_omp&lt;br /&gt;
Результат: 9.01 сек&lt;br /&gt;
СК «Ломоносов-2» (8 потоков OpenMP, очередь test)&lt;br /&gt;
Команда: sbatch -p test -n 1 --cpus-per-task=8 job_omp_8.sh&lt;br /&gt;
Результат: 11.02 сек&lt;br /&gt;
Массив из 1 млрд. элементов&lt;br /&gt;
Локальный компьютер (8 потоков OpenMP)&lt;br /&gt;
Команда: OMP_NUM_THREADS=8 ./mergesort_omp&lt;br /&gt;
Результат: не справился с работой&lt;br /&gt;
СК «Ломоносов-2» (8 потоков OpenMP, очередь test)&lt;br /&gt;
Команда: sbatch -p test -n 1 --cpus-per-task=8 job_omp_8.sh&lt;br /&gt;
Результат: 85.9 сек&lt;br /&gt;
Исследование масштабируемости на СК «Ломоносов-2»:&lt;br /&gt;
Массив 1 млрд. элементов&lt;br /&gt;
1 поток: 213,78 сек&lt;br /&gt;
2 потока: 178,246 сек&lt;br /&gt;
4 потока: 120,722 сек&lt;br /&gt;
8 потоков: 88,04 сек&lt;br /&gt;
14 потоков: 73,336 сек&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Сортировка слиянием хорошо масштабируется на MIMD- и гибридных архитектурах благодаря независимому выполнению подзадач. На SIMD-архитектурах её эффективность ограничена, а на SISD работает предсказуемо, но без ускорения. На распределённых системах ключевым фактором становится оптимизация объёма межпроцессных обменов.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30074</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30074"/>
		<updated>2025-11-25T15:17:28Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Kiryan|К.Е.Деревянкин]].&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием имеет рекурсивную структуру: исходный массив делится на части, каждая часть сортируется независимо, после чего отсортированные подмассивы последовательно объединяются в единый массив.&lt;br /&gt;
&lt;br /&gt;
Таким образом, максимальный параллелизм достигается на этапе независимых локальных сортировок, а по мере продвижения к этапам слияния количество одновременно выполняющихся процессов уменьшается.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На вход алгоритму подаётся:&lt;br /&gt;
&lt;br /&gt;
* Одномерный массив чисел длиной N, который требуется отсортировать по возрастанию A=[a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​,…,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​]&lt;br /&gt;
* Количество процессов P, участвующих в вычислении&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма формируется отсортированный массив длиной N:&lt;br /&gt;
&lt;br /&gt;
A′ = [a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​, a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​​, a&#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​​, … , a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​], a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​ ​≤ a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​ ​≤ ⋯ ≤ a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​​&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием относится к классу рекурсивных алгоритмов типа «разделяй и властвуй» (divide and conquer).&lt;br /&gt;
Параллельная версия основана на независимой обработке подмножеств данных и их последующем слиянии.&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует параллелизм по данным — каждый процесс сортирует свою часть массива независимо от других.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм сортировки слиянием основан на принципе «разделяй и властвуй» и включает рекурсивное разбиение массива на две части до подмассивов размера 1. На каждом шаге используется вспомогательная память для копирования левой и правой части массива, после чего выполняется операция слияния, работающая за линейное время. Алгоритм является стабильным и полностью детерминированным, а его асимптотическая сложность составляет . Благодаря независимости обработки левого и правого подмассивов данная реализация хорошо подходит для последующей параллелизации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Параллельная реализация сортировки слиянием основана на том, что сортировка левой и правой части массива выполняется независимо, что делает алгоритм естественно распараллеливаемым. Основной принцип параллельной версии заключается в создании отдельных задач (threads или процессов), отвечающих за сортировку подмассивов на различных уровнях рекурсивного дерева.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Сортировка слиянием хорошо масштабируется на MIMD- и гибридных архитектурах благодаря независимому выполнению подзадач. На SIMD-архитектурах её эффективность ограничена, а на SISD работает предсказуемо, но без ускорения. На распределённых системах ключевым фактором становится оптимизация объёма межпроцессных обменов.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30073</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30073"/>
		<updated>2025-11-25T15:16:01Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Выводы для классов архитектур */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием имеет рекурсивную структуру: исходный массив делится на части, каждая часть сортируется независимо, после чего отсортированные подмассивы последовательно объединяются в единый массив.&lt;br /&gt;
&lt;br /&gt;
Таким образом, максимальный параллелизм достигается на этапе независимых локальных сортировок, а по мере продвижения к этапам слияния количество одновременно выполняющихся процессов уменьшается.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На вход алгоритму подаётся:&lt;br /&gt;
&lt;br /&gt;
* Одномерный массив чисел длиной N, который требуется отсортировать по возрастанию A=[a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​,…,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​]&lt;br /&gt;
* Количество процессов P, участвующих в вычислении&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма формируется отсортированный массив длиной N:&lt;br /&gt;
&lt;br /&gt;
A′ = [a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​, a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​​, a&#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​​, … , a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​], a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​ ​≤ a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​ ​≤ ⋯ ≤ a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​​&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием относится к классу рекурсивных алгоритмов типа «разделяй и властвуй» (divide and conquer).&lt;br /&gt;
Параллельная версия основана на независимой обработке подмножеств данных и их последующем слиянии.&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует параллелизм по данным — каждый процесс сортирует свою часть массива независимо от других.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм сортировки слиянием основан на принципе «разделяй и властвуй» и включает рекурсивное разбиение массива на две части до подмассивов размера 1. На каждом шаге используется вспомогательная память для копирования левой и правой части массива, после чего выполняется операция слияния, работающая за линейное время. Алгоритм является стабильным и полностью детерминированным, а его асимптотическая сложность составляет . Благодаря независимости обработки левого и правого подмассивов данная реализация хорошо подходит для последующей параллелизации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Параллельная реализация сортировки слиянием основана на том, что сортировка левой и правой части массива выполняется независимо, что делает алгоритм естественно распараллеливаемым. Основной принцип параллельной версии заключается в создании отдельных задач (threads или процессов), отвечающих за сортировку подмассивов на различных уровнях рекурсивного дерева.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Сортировка слиянием хорошо масштабируется на MIMD- и гибридных архитектурах благодаря независимому выполнению подзадач. На SIMD-архитектурах её эффективность ограничена, а на SISD работает предсказуемо, но без ускорения. На распределённых системах ключевым фактором становится оптимизация объёма межпроцессных обменов.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30072</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30072"/>
		<updated>2025-11-25T15:15:31Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием имеет рекурсивную структуру: исходный массив делится на части, каждая часть сортируется независимо, после чего отсортированные подмассивы последовательно объединяются в единый массив.&lt;br /&gt;
&lt;br /&gt;
Таким образом, максимальный параллелизм достигается на этапе независимых локальных сортировок, а по мере продвижения к этапам слияния количество одновременно выполняющихся процессов уменьшается.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На вход алгоритму подаётся:&lt;br /&gt;
&lt;br /&gt;
* Одномерный массив чисел длиной N, который требуется отсортировать по возрастанию A=[a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​,…,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​]&lt;br /&gt;
* Количество процессов P, участвующих в вычислении&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма формируется отсортированный массив длиной N:&lt;br /&gt;
&lt;br /&gt;
A′ = [a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​, a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​​, a&#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​​, … , a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​], a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​ ​≤ a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​ ​≤ ⋯ ≤ a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​​&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием относится к классу рекурсивных алгоритмов типа «разделяй и властвуй» (divide and conquer).&lt;br /&gt;
Параллельная версия основана на независимой обработке подмножеств данных и их последующем слиянии.&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует параллелизм по данным — каждый процесс сортирует свою часть массива независимо от других.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм сортировки слиянием основан на принципе «разделяй и властвуй» и включает рекурсивное разбиение массива на две части до подмассивов размера 1. На каждом шаге используется вспомогательная память для копирования левой и правой части массива, после чего выполняется операция слияния, работающая за линейное время. Алгоритм является стабильным и полностью детерминированным, а его асимптотическая сложность составляет . Благодаря независимости обработки левого и правого подмассивов данная реализация хорошо подходит для последующей параллелизации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Параллельная реализация сортировки слиянием основана на том, что сортировка левой и правой части массива выполняется независимо, что делает алгоритм естественно распараллеливаемым. Основной принцип параллельной версии заключается в создании отдельных задач (threads или процессов), отвечающих за сортировку подмассивов на различных уровнях рекурсивного дерева.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30071</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30071"/>
		<updated>2025-11-25T15:15:01Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Особенности реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием имеет рекурсивную структуру: исходный массив делится на части, каждая часть сортируется независимо, после чего отсортированные подмассивы последовательно объединяются в единый массив.&lt;br /&gt;
&lt;br /&gt;
Таким образом, максимальный параллелизм достигается на этапе независимых локальных сортировок, а по мере продвижения к этапам слияния количество одновременно выполняющихся процессов уменьшается.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На вход алгоритму подаётся:&lt;br /&gt;
&lt;br /&gt;
* Одномерный массив чисел длиной N, который требуется отсортировать по возрастанию A=[a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​,…,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​]&lt;br /&gt;
* Количество процессов P, участвующих в вычислении&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма формируется отсортированный массив длиной N:&lt;br /&gt;
&lt;br /&gt;
A′ = [a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​, a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​​, a&#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​​, … , a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​], a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​ ​≤ a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​ ​≤ ⋯ ≤ a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​​&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием относится к классу рекурсивных алгоритмов типа «разделяй и властвуй» (divide and conquer).&lt;br /&gt;
Параллельная версия основана на независимой обработке подмножеств данных и их последующем слиянии.&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует параллелизм по данным — каждый процесс сортирует свою часть массива независимо от других.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Последовательный алгоритм сортировки слиянием основан на принципе «разделяй и властвуй» и включает рекурсивное разбиение массива на две части до подмассивов размера 1. На каждом шаге используется вспомогательная память для копирования левой и правой части массива, после чего выполняется операция слияния, работающая за линейное время. Алгоритм является стабильным и полностью детерминированным, а его асимптотическая сложность составляет . Благодаря независимости обработки левого и правого подмассивов данная реализация хорошо подходит для последующей параллелизации.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30008</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30008"/>
		<updated>2025-11-07T17:51:40Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием имеет рекурсивную структуру: исходный массив делится на части, каждая часть сортируется независимо, после чего отсортированные подмассивы последовательно объединяются в единый массив.&lt;br /&gt;
&lt;br /&gt;
Таким образом, максимальный параллелизм достигается на этапе независимых локальных сортировок, а по мере продвижения к этапам слияния количество одновременно выполняющихся процессов уменьшается.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На вход алгоритму подаётся:&lt;br /&gt;
&lt;br /&gt;
* Одномерный массив чисел длиной N, который требуется отсортировать по возрастанию A=[a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​,…,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​]&lt;br /&gt;
* Количество процессов P, участвующих в вычислении&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма формируется отсортированный массив длиной N:&lt;br /&gt;
&lt;br /&gt;
A′ = [a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​, a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​​, a&#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​​, … , a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​], a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​ ​≤ a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​ ​≤ ⋯ ≤ a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​​&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием относится к классу рекурсивных алгоритмов типа «разделяй и властвуй» (divide and conquer).&lt;br /&gt;
Параллельная версия основана на независимой обработке подмножеств данных и их последующем слиянии.&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует параллелизм по данным — каждый процесс сортирует свою часть массива независимо от других.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30007</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30007"/>
		<updated>2025-11-07T17:44:19Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием имеет рекурсивную структуру: исходный массив делится на части, каждая часть сортируется независимо, после чего отсортированные подмассивы последовательно объединяются в единый массив.&lt;br /&gt;
&lt;br /&gt;
Таким образом, максимальный параллелизм достигается на этапе независимых локальных сортировок, а по мере продвижения к этапам слияния количество одновременно выполняющихся процессов уменьшается.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На вход алгоритму подаётся:&lt;br /&gt;
&lt;br /&gt;
* Одномерный массив чисел длиной N, который требуется отсортировать по возрастанию A=[a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​,a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​,…,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​]&lt;br /&gt;
* Количество процессов P, участвующих в вычислении&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма формируется отсортированный массив длиной N:&lt;br /&gt;
&lt;br /&gt;
A′ = [a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​, a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​​, a&#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;​​, … , a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​], a&#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;​ ​≤ a&#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;​ ​≤ ⋯ ≤ a&#039;&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;​​&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30006</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30006"/>
		<updated>2025-11-07T17:37:28Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием имеет рекурсивную структуру: исходный массив делится на части, каждая часть сортируется независимо, после чего отсортированные подмассивы последовательно объединяются в единый массив.&lt;br /&gt;
&lt;br /&gt;
Таким образом, максимальный параллелизм достигается на этапе независимых локальных сортировок, а по мере продвижения к этапам слияния количество одновременно выполняющихся процессов уменьшается.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30005</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30005"/>
		<updated>2025-11-07T17:26:01Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|800px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30004</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=30004"/>
		<updated>2025-11-07T17:25:37Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
[[File:Merge_sort.png|1000px]]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=29976</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=29976"/>
		<updated>2025-11-07T14:13:01Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
На каждом шаге массив размером n делится на две части, каждая из которых рекурсивно сортируется, после чего выполняется операция слияния двух отсортированных подмассивов.&lt;br /&gt;
&lt;br /&gt;
Рекуррентное соотношение для оценки времени работы алгоритма имеет вид:&lt;br /&gt;
&lt;br /&gt;
T(n) = 2T(n/2) + O(n), где O(n) — затраты времени на слияние двух половин массива.&lt;br /&gt;
&lt;br /&gt;
Последовательная временная сложность сортировки слиянием: T(n) = O(nlogn).&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=29974</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=29974"/>
		<updated>2025-11-07T13:58:59Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задан массив&lt;br /&gt;
A = [a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], a&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; ∈ R, i = 1, ...,n,&lt;br /&gt;
требующий сортировки по возрастанию.&lt;br /&gt;
&lt;br /&gt;
Основная идея алгоритма&lt;br /&gt;
# Разделение: массив  рекурсивно делится пополам до получения подмассивов длины 1, каждый из которых считается отсортированным.&lt;br /&gt;
# Слияние: два отсортированных подмассива  и  объединяются в один отсортированный массив. На каждой итерации сравниваются первые элементы подмассивов, меньший элемент добавляется в результирующий массив, и указатель смещается. Процесс продолжается, пока все элементы не будут объединены.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=29967</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=29967"/>
		<updated>2025-11-07T13:09:01Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Алгоритм сортировки слиянием реализует стратегию «разделяй и властвуй» (divide and conquer) и состоит из трех макрофаз:&lt;br /&gt;
# Разделения (Divide). Рекурсивная декомпозиция на подмассивы&lt;br /&gt;
# Базовые случаи (Conquer). Обработка тривиальных подзадач&lt;br /&gt;
# Слияние (Combine). Иерархическое объединение результатов&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=29840</id>
		<title>Участник:Kiryan/Алгоритм сортировки слиянием</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=29840"/>
		<updated>2025-11-03T12:09:39Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: Новая страница: «== Свойства и структура алгоритмов == &amp;#039;&amp;#039;&amp;#039; === Общее описание алгоритма === &amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Сортировка слия...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка слиянием&#039;&#039;&#039; (англ. &#039;&#039;merge sort&#039;&#039;) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был изобретён Джоном фон Нейманом в 1945 году&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество элементов: S = {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, ..., a&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;} с определенным на нем отношением линейного порядка ≤. Требуется найти такую перестановку π ∈ S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, что:∀i,j ∈ {1, 2, ..., n}: i &amp;lt; j ⇒ a&amp;lt;sub&amp;gt;π(i)&amp;lt;/sub&amp;gt; ≤ a&amp;lt;sub&amp;gt;π(j)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм реализует стратегию «разделяй и властвуй», состоящую из трех этапов:&lt;br /&gt;
&lt;br /&gt;
# Разделение: Исходный массив рекурсивно делится на две примерно равные части до достижения базового случая (массивы длины 1)&lt;br /&gt;
# Упорядочивание: Базовые случаи (массивы длины 1) по определению являются отсортированными&lt;br /&gt;
# Слияние: Отсортированные подмассивы объединяются в один отсортированный массив&lt;br /&gt;
&lt;br /&gt;
Операция разделения: SPLIT(A, p, r) = (A[p..q], A[q+1..r]), где q = ⌊(p + r)/2⌋&lt;br /&gt;
&lt;br /&gt;
Операция слияния: MERGE(L, R) = S, где L и R — отсортированные массивы, S — отсортированный массив, содержащий все элементы L и R.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма составляет процедура слияния двух отсортированных массивов, которая выполняется на каждом уровне рекурсии и определяет общую производительность алгоритма.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#&lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=29838</id>
		<title>Участник:Kiryan/Алгоритм сортировки вставками</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kiryan/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=29838"/>
		<updated>2025-11-03T11:52:06Z</updated>

		<summary type="html">&lt;p&gt;Kiryan: Новая страница: «Основные авторы описания: Деревянкин К.Е.  #  == Свойства и структура алгоритмов == &amp;#039;&amp;#039;&amp;#039; === Обще...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Деревянкин К.Е.&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Сортировка вставками&#039;&#039;&#039; (англ. &#039;&#039;Insertion sort&#039;&#039;) — алгоритм сортировки, в котором элементы входной последовательности просматриваются по одному, и каждый новый поступивший элемент размещается в подходящее место среди ранее упорядоченных элементов.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Пусть задано множество: S = {x₁, x₂, ..., xₙ} ⊆ X, где (X, ≼) — линейно упорядоченное множество. Требуется найти биекцию π: {1,2,...,n} → {1,2,...,n} такую, что: x&amp;lt;sub&amp;gt;π(1)&amp;lt;/sub&amp;gt; ≼ x&amp;lt;sub&amp;gt;π(2)&amp;lt;/sub&amp;gt; ≼ ... ≼ x&amp;lt;sub&amp;gt;π(n)&amp;lt;/sub&amp;gt;. &lt;br /&gt;
Алгоритм сортировки вставками можно представить как последовательность преобразований массива A:&lt;br /&gt;
&lt;br /&gt;
A&amp;lt;sup&amp;gt;(0)&amp;lt;/sup&amp;gt; = A&lt;br /&gt;
&lt;br /&gt;
A&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt; = INSERT(A&amp;lt;sup&amp;gt;(0)&amp;lt;/sup&amp;gt;, 1)&lt;br /&gt;
&lt;br /&gt;
A&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt; = INSERT(A&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;, 2)&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
A&amp;lt;sup&amp;gt;(n-1)&amp;lt;/sup&amp;gt; = INSERT(A&amp;lt;sup&amp;gt;(n-2)&amp;lt;/sup&amp;gt;, n-1),&lt;br /&gt;
&lt;br /&gt;
где операция INSERT определяется как: INSERT(B, k) = [b₀, b₁, ..., b&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;, b&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, b&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;, ..., b&amp;lt;sub&amp;gt;k-1&amp;lt;/sub&amp;gt;, b&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;, ..., b&amp;lt;sub&amp;gt;m-1&amp;lt;/sub&amp;gt;], где j = max{i ∈ {0,1,...,k} | ∀l &amp;lt; i: b&amp;lt;sub&amp;gt;l&amp;lt;/sub&amp;gt; ≼ b&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;} ∪ {-1} + 1&lt;br /&gt;
&lt;br /&gt;
После k-й итерации внешнего цикла (0 ≤ k ≤ n-1) выполняется:&lt;br /&gt;
 &lt;br /&gt;
# Элемент маркированного списка&lt;br /&gt;
# Подмассив A[0..k] отсортирован: ∀i,j ∈ {0,...,k}: i &amp;lt; j ⇒ A[i] ≼ A[j]&lt;br /&gt;
Множество элементов в A[0..k] есть перестановка исходных элементов A&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;[0..k]&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Вычислительное ядро алгоритма сортировки вставками составляет операция вставки элемента в отсортированную последовательность, которая выполняется на каждой итерации внешнего цикла.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
# &lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
# &lt;br /&gt;
== Литература ==&lt;br /&gt;
Knuth D.E. The Art of Computer Programming. Volume 3: Sorting and Searching. – 2nd ed. – Addison-Wesley, 1998. – 780 p.&lt;/div&gt;</summary>
		<author><name>Kiryan</name></author>
	</entry>
</feed>