<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.254.254.86&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.254.254.86&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%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/109.254.254.86"/>
		<updated>2026-05-11T13:09:56Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=65734</id>
		<title>Сортировки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8&amp;diff=65734"/>
				<updated>2018-05-21T18:45:43Z</updated>
		
		<summary type="html">&lt;p&gt;109.254.254.86: /* Сравнение сортировок */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;wikitex&amp;gt;&lt;br /&gt;
''Сортировкой'' (англ. ''sorting'') называется процесс упорядочивания множества объектов по какому-либо признаку.&lt;br /&gt;
&lt;br /&gt;
Так как данные могут хранится в разных структурах, то и алгоритмы для каждой структуры могут отличаться. Например, при хранении данных в списке сортировка кучей потребует $O(n^2 \log n)$ времени против $O(n \log n)$ с использованием массива; а вот сортировка пузырьком не изменится.&lt;br /&gt;
&lt;br /&gt;
Также есть алгоритмы параллельной сортировки данных (т.н. [[Сортирующие сети]]), время работы которых в лучшем случае $O(\log n)$. &lt;br /&gt;
== Классификация сортировок ==&lt;br /&gt;
&lt;br /&gt;
=== Время работы ===&lt;br /&gt;
&lt;br /&gt;
Эту классификацию обычно считают самой важной. Оценивают худшее время алгоритма, среднее и лучшее. Лучшее время — минимальное время работы алгоритма на каком-либо наборе, обычно этим набором является тривиальный $\big[ 1 \ldots n \big] $. Худшее время — наибольшее время.&lt;br /&gt;
У большинства алгоритмов временные оценки бывают $O(n \log n)$ и $O(n^2)$.&lt;br /&gt;
&lt;br /&gt;
=== Память ===&lt;br /&gt;
&lt;br /&gt;
Параметр сортировки, показывающий, сколько '''дополнительной''' памяти требуется алгоритму. Сюда входят и дополнительный массив, и переменные, и затраты на стек вызовов. Обычно затраты бывают $O(1)$, $O(\log n)$, $O(n)$.&lt;br /&gt;
&lt;br /&gt;
=== Устойчивость ===&lt;br /&gt;
&lt;br /&gt;
''Устойчивой сортировкой'' называется сортировка, не меняющая порядка объектов с одинаковыми ключами. Ключ — поле элемента, по которому мы производим сортировку. &lt;br /&gt;
&lt;br /&gt;
=== Количество обменов ===&lt;br /&gt;
&lt;br /&gt;
Количество обменов может быть важным параметром в случае, если объекты имеют большой размер. В таком случае при большом количестве обменов время алгоритма заметно увеличивается.&lt;br /&gt;
&lt;br /&gt;
=== Детерминированность ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм сортировки называется ''детерминированным'', если каждая операция присваивания, обмена и т.д. не зависит от предыдущих.&lt;br /&gt;
Все сортирующие сети являются детерминированными.&lt;br /&gt;
&lt;br /&gt;
== Сравнение сортировок ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим массив $\big[ 1 \ldots n \big]$. Для элементов должно выполняться отношение порядка.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;|Название !!width=&amp;quot;8%&amp;quot;| Лучшее время !!width=&amp;quot;8%&amp;quot;| Среднее !!width=&amp;quot;8%&amp;quot;| Худшее !!width=&amp;quot;8%&amp;quot;| Память !! width=&amp;quot;8%&amp;quot;|Устойчивость !! width=&amp;quot;10%| Обмены (в среднем) !! &amp;quot;width=&amp;quot;35%&amp;quot;| Описание&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Сортировка пузырьком| Сортировка пузырьком &amp;lt;br&amp;gt;(Bubble Sort)]]&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|$O(1)$&lt;br /&gt;
|Да&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|Алгоритм состоит в повторяющихся проходах по сортируемому массиву. На каждой итерации последовательно сравниваются соседние элементы, и, если порядок в паре неверный, то элементы меняют местами.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Сортировка вставками| Сортировка вставками &amp;lt;br&amp;gt;(Insertion Sort)]]&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|$O(1)$&lt;br /&gt;
|Да&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированной части массива до тех пор, пока весь набор входных данных не будет отсортирован.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Сортировка Шелла| Сортировка Шелла &amp;lt;br&amp;gt;(Shellsort)]]&lt;br /&gt;
|$O(n\log^2{n})$&lt;br /&gt;
|Зависит от выбора шага&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|$O(1)$&lt;br /&gt;
|Нет&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|Является модификацией сортировки вставками, сортируем между собой элементы, стоящие на кратных нашему шагу местах. &lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Сортировка выбором| Сортировка выбором&amp;lt;br&amp;gt; (Selection Sort)]]&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|$O(n^2)$&lt;br /&gt;
|$O(1)$&lt;br /&gt;
|Нет&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|На $i$-ом шаге алгоритма находим минимальный среди последних $n - i + 1$, и меняем его местами с $i$-ым элементом в массиве.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Быстрая сортировка|Быстрая сортировка&amp;lt;br&amp;gt; (Quick Sort)]]&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(n^2)$&amp;lt;br&amp;gt;(маловероятно)&lt;br /&gt;
|$O(\log n)$&amp;lt;br&amp;gt;(стек вызовов)&lt;br /&gt;
|Нет&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|Один из самых известных и широко используемых алгоритмов сортировки. Алгоритм состоит в выборе опорного элемента, разделении массива на 2 части относительно опорного (одна — все элементы, меньшие опорного элемента, вторая — большие), и в сортировке полученных частей рекурсивным вызовом себя от них.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Сортировка слиянием|Сортировка слиянием &amp;lt;br&amp;gt;(Merge Sort)]]&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(n)$ (обычная реализация)&amp;lt;br&amp;gt;$O(1)$&amp;lt;br&amp;gt; ([[Cортировка слиянием с использованием O(1) дополнительной памяти|модифицированная реализация]])&lt;br /&gt;
|Да&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|Алгоритм состоит в разделении массива пополам, сортировке половин и их слиянии.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Timsort| Timsort]]&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|Да&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|Гибрид сортировки слиянием. Разбиваем массив на подмассивы фиксированной длины и сортируем каждый подмассив любой устойчивой сортировкой. После чего объединяем отсортированные подмассивы модифицированной сортировкой слиянием.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Сортировка кучей|Сортировка кучей &amp;lt;br&amp;gt;(Heap Sort)]]&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(1)$&lt;br /&gt;
|Нет&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|Строим из массива кучу, по очереди извлекаем минимум кучи.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Smoothsort| Плавная сортировка &amp;lt;br&amp;gt;(Smoothsort)]]&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|$O(1)$&lt;br /&gt;
|Нет&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|Модификация сортировки кучей. Вместо двоичной кучи используем K-ую кучу Леонардо.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Терпеливая сортировка| Терпеливая сортировка &amp;lt;br&amp;gt;(Patience sorting)]]&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|Нет&lt;br /&gt;
|$O(n\log{n})$&lt;br /&gt;
|Раскидываем элементы массива по стопкам, после чего строим двоичную кучу из стопок. Позволяет также вычислить длину наибольшей возрастающей подпоследовательности данного массива. &lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Дерево поиска, наивная реализация|Сортировка с помощью бинарного дерева &amp;lt;br&amp;gt;(Tree Sort)]]&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|Да&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|Добавляем по очереди вершины в сбалансированное дерево поиска, проходим по всем вершинам в порядке возрастания.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Карманная сортировка|Карманная сортировка &amp;lt;br&amp;gt;(Bucket Sort)]]&lt;br /&gt;
|$O(n + k)$&lt;br /&gt;
|$O(n \log_k n)$&lt;br /&gt;
|$O(n \cdot k)$&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|Да&lt;br /&gt;
| -&lt;br /&gt;
|Распределяем элементы в $k$ карманов, сортируем элементы внутри карманов, из каждого кармана данные записываются в массив в порядке разбиения.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Цифровая сортировка|Цифровая сортировка &amp;lt;br&amp;gt;(Radix Sort)]]&lt;br /&gt;
|$O(n \lg n)$&lt;br /&gt;
|$O(n \lg n)$&lt;br /&gt;
|$O(n \lg n)$&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|Да&lt;br /&gt;
| -&lt;br /&gt;
|Сортировка объектов равной длины, имеющих &amp;quot;разряды&amp;quot;. обычно это строки или целые числа. Алгоритм состоит в том, чтобы отсортировать объекты по разрядам, начиная от младших к старшим.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Сортировка подсчетом|Сортировка подсчетом &amp;lt;br&amp;gt;(Counting Sort)]]&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|$O(n + k)$&lt;br /&gt;
|$O(k)$&lt;br /&gt;
|$O(k)$&lt;br /&gt;
|Да&lt;br /&gt;
|$O(n + k)$&lt;br /&gt;
|Сортировка целых чисел, входящих в какой-то небольшой диапазон. Создаем массив длины диапазона $k$, каждый элемент которого будет показывать, сколько исходных элементов равны данному. Бежим по массиву и считаем количество вхождений каждого числа.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Сортировка Хэна (или Хана?)|Сортировка Хэна &amp;lt;br&amp;gt;(Han's Sort)]]&lt;br /&gt;
|$O(n \log \log n)$&lt;br /&gt;
|$O(n \log \log n)$&lt;br /&gt;
|$O(n \log \log n)$&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|Да&lt;br /&gt;
|$O(n \log \log n)$&lt;br /&gt;
|Очень сложная сортировка, основанная на принадлежности ключей к целым числам. Использует экспоненциальное поисковое дерево Андерсона.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Многопоточная сортировка слиянием|Многопоточная сортировка слиянием &amp;lt;br&amp;gt;(Multithreaded merge sort)]]&lt;br /&gt;
|$O(\frac{n}{N_{ind}}\log \frac{n}{N_{ind}})$&lt;br /&gt;
|$O(\frac{n}{N_{ind}}\log \frac{n}{N_{ind}})$&lt;br /&gt;
|$O(\frac{n}{N_{ind}}\log \frac{n}{N_{ind}})$&lt;br /&gt;
|$O(n)$&lt;br /&gt;
|Да&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|Отличается от сортировки слиянием только тем, что при рекурсивном вызове будет создавать новый поток.&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[PSRS-сортировка|PSRS-сортировка &amp;lt;br&amp;gt;(PSRS-sorting)]]&lt;br /&gt;
|$O(\frac{n}{N_{ind}}\log \frac{n}{N_{ind}})$&lt;br /&gt;
|$O(\frac{n}{N_{ind}}\log \frac{n}{N_{ind}})$&lt;br /&gt;
|$O(\frac{n}{N_{ind}}\log \frac{n}{N_{ind}})$&lt;br /&gt;
|$O(N_{ind}^2)$&lt;br /&gt;
|Нет&lt;br /&gt;
|$O(n \log n)$&lt;br /&gt;
|Разделим массив на $N_{ind}$ подмассива и запустим в каждой быструю сортировку. После этого объединим все эти подмассивы.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Поисковые структуры данных]]&lt;br /&gt;
*[[Приоритетные очереди]]&lt;br /&gt;
*[[Поиск подстроки в строке]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%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 Википедия {{---}} Алгоритмы сортировки]&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Sorting_algorithm Wikipedia {{---}}Sorting algorithm]&lt;br /&gt;
*[http://habrahabr.ru/post/221807/ Хабрахабр {{---}} Бенчмарк алгоритмов сортировки]&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 3-е изд. — М.: «Вильямс», 2013. — с. 174. — ISBN 978-5-8459-1794-2&lt;br /&gt;
&amp;lt;/wikitex&amp;gt;&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;br /&gt;
[[Категория: Квадратичные сортировки]]&lt;br /&gt;
[[Категория: Сортировки на сравнениях]]&lt;br /&gt;
[[Категория: Многопоточные сортировки]]&lt;br /&gt;
[[Категория: Другие сортировки]]&lt;/div&gt;</summary>
		<author><name>109.254.254.86</name></author>	</entry>

	</feed>