Алгоритм сортировки
[править]
Материал из Википедии — свободной энциклопедии
(Перенаправлено с Сортировки)
Алгоритм сортировки — это алгоритм для упорядочения элементов в списке. В
случае, когда элемент списка имеет несколько полей, поле, служащее критерием
порядка, называется ключом сортировки. На практике в качестве ключа часто
выступает число, а в остальных полях хранятся какие-либо данные, никак не
влияющие на работу алгоритма.
Содержание
[убрать]
1 Оценка алгоритма сортировки
2 Классификация алгоритмов сортировки
3 Список алгоритмов сортировки
3.1 Алгоритмы устойчивой сортировки
3.2 Алгоритмы неустойчивой сортировки
3.3 Непрактичные алгоритмы сортировки
3.4 Алгоритмы, не основанные на сравнениях
3.5 Прочие алгоритмы сортировки
4 См. также
5 Литература
6 Примечания
7 Ссылки
[править] Оценка алгоритма сортировки
Алгоритмы сортировки оцениваются по скорости выполнения и эффективности
использования памяти:
Прошивка магнитолы Geely Atlas
Прошивка магнитолы Geely Coolray
Прошивка магнитолы Geely Atlas Pro
Прошивка магнитолы Geely Tugella
Время — основной параметр, характеризующий быстродействие алгоритма. Называется
также вычислительной сложностью. Для упорядочения важны худшее, среднее и лучшее
поведение алгоритма в терминах мощности входного множества A. Если на вход
алгоритму подаётся множество A, то обозначим n = | A | . Для типичного алгоритма
хорошее поведение — это O \left(n \log n \right)[1] и плохое поведение — это O \left(n^2
\right). Идеальное поведение для упорядочения — O \left(n \right). Алгоритмы
сортировки, использующие только абстрактную операцию сравнения ключей всегда
нуждаются по меньшей мере в \Omega \left(n \log n \right) сравнениях. Тем не
менее, существует алгоритм сортировки Хана (Yijie Han) с вычислительной
сложностью O \left(n \cdot \log \log n \cdot \log \log \log n \right),
использующий тот факт, что пространство ключей ограничено (он чрезвычайно
сложен, а за О-обозначением скрывается весьма большой коэффициент, что делает
невозможным его применение в повседневной практике). Также существует понятие
сортирующих сетей. Предполагая, что можно одновременно (например, при
параллельном вычислении) проводить несколько сравнений, можно отсортировать n
чисел за O \left(\log^2 n \right) операций. При этом число n должно быть заранее
известно;
Память — ряд алгоритмов требует выделения дополнительной памяти под временное
хранение данных. Как правило, эти алгоритмы требуют O \left(\log n \right)
памяти. При оценке не учитывается место, которое занимает исходный массив и
независящие от входной последовательности затраты, например, на хранение кода
программы (так как всё это потребляет O \left(1 \right)). Алгоритмы сортировки,
не потребляющие дополнительной памяти, относят к сортировкам на месте.
[править] Классификация алгоритмов сортировки
Устойчивость (stability) — устойчивая сортировка не меняет взаимного
расположения равных элементов.
Естественность поведения — эффективность метода при обработке уже упорядоченных,
или частично упорядоченных данных. Алгоритм ведёт себя естественно, если
учитывает эту характеристику входной последовательности и работает лучше.
Использование операции сравнения. Алгоритмы, использующие для сортировки
сравнение элементов между собой, называются основанными на сравнениях.
Минимальная трудоемкость худшего случая для этих алгоритмов составляет O \left(n
\log n \right), но они отличаются гибкостью применения. Для специальных случаев
(типов данных) существуют более эффективные алгоритмы.
Ещё одним важным свойством алгоритма является его сфера применения. Здесь
основных типов упорядочения два:
Внутренняя сортировка оперирует с массивами, целиком помещающимися в оперативной
памяти с произвольным доступом к любой ячейке. Данные обычно упорядочиваются на
том же месте, без дополнительных затрат.
В современных архитектурах персональных компьютеров широко применяется подкачка
и кэширование памяти. Алгоритм сортировки должен хорошо сочетаться с
применяемыми алгоритмами кэширования и подкачки.
Внешняя сортировка оперирует с запоминающими устройствами большого объёма, но с
доступом не произвольным, а последовательным (упорядочение файлов), т. е. в
данный момент мы 'видим' только один элемент, а затраты на перемотку по
сравнению с памятью неоправданно велики. Это накладывает некоторые
дополнительные ограничения на алгоритм и приводит к специальным методам
упорядочения, обычно использующим дополнительное дисковое пространство. Кроме
того, доступ к данным на носителе производится намного медленнее, чем операции с
оперативной памятью.
Доступ к носителю осуществляется последовательным образом: в каждый момент
времени можно считать или записать только элемент, следующий за текущим.
Объём данных не позволяет им разместиться в ОЗУ.
Также алгоритмы классифицируются по:
потребности в дополнительной памяти или её отсутствии
потребности в знаниях о структуре данных, выходящих за рамки операции сравнения,
или отсутствии таковой
[править] Список алгоритмов сортировки
В этой таблице n — это количество записей, которые необходимо упорядочить, а k —
это количество уникальных ключей.
[править] Алгоритмы устойчивой сортировки
Сортировка пузырьком (англ. Bubble sort ) — сложность алгоритма: O(n2); для
каждой пары индексов производится обмен, если элементы расположены не по
порядку.
Сортировка перемешиванием (Шейкерная, Cocktail sort, bidirectional bubble sort)
— Сложность алгоритма: O(n2)
Гномья сортировка — имеет общее с сортировкой пузырьком и сортировкой вставками.
Сложность алгоритма — O(n2).
Сортировка вставками (Insertion sort) — Сложность алгоритма: O(n2); определяем
где текущий элемент должен находиться в упорядоченном списке и вставляем его
туда
Блочная сортировка (Корзинная сортировка, Bucket sort) — Сложность алгоритма:
O(n); требуется O(k) дополнительной памяти и знание о природе сортируемых
данных, выходящее за рамки функций "переставить" и "сравнить".
Сортировка подсчётом (Counting sort) — Сложность алгоритма: O(n+k); требуется
O(n+k) дополнительной памяти (рассмотрено 3 варианта)
Сортировка слиянием (Merge sort) — Сложность алгоритма: O(n log n); требуется
O(n) дополнительной памяти; выстраиваем первую и вторую половину списка
отдельно, а затем — сливаем упорядоченные списки
Сортировка с помощью двоичного дерева (англ. Tree sort) — Сложность алгоритма:
O(n log n); требуется O(n) дополнительной памяти
[править] Алгоритмы неустойчивой сортировки
Сортировка выбором (Selection sort) — Сложность алгоритма: O(n2); поиск
наименьшего или наибольшего элемента и помещения его в начало или конец
упорядоченного списка
Сортировка Шелла (Shell sort) — Сложность алгоритма: O(n log2 n); попытка
улучшить сортировку вставками
Сортировка расчёской (Comb sort) — Сложность алгоритма: O(n log n)
Пирамидальная сортировка (Сортировка кучи, Heapsort) — Сложность алгоритма: O(n
log n); превращаем список в кучу, берём наибольший элемент и добавляем его в
конец списка
Плавная сортировка (Smoothsort) — Сложность алгоритма: O(n log n)
Быстрая сортировка (Quicksort), в варианте с минимальными затратами памяти —
Сложность алгоритма: O(n log n) — среднее время, O(n2) — худший случай; широко
известен как быстрейший из известных для упорядочения больших случайных списков;
с разбиением исходного набора данных на две половины так, что любой элемент
первой половины упорядочен относительно любого элемента второй половины; затем
алгоритм применяется рекурсивно к каждой половине. При использовании O(n)
дополнительной памяти, можно сделать сортировку устойчивой.
Introsort — Сложность алгоритма: O(n log n), сочетание быстрой и пирамидальной
сортировки. Пирамидальная сортировка применяется в случае, если глубина рекурсии
превышает log(n).
Patience sorting — Сложность алгоритма: O(n log n) — наихудший случай, требует
дополнительно O(n) памяти, также находит самую длинную увеличивающуюся
подпоследовательность
Stooge sort — рекурсивный алгоритм сортировки с временной сложностью
O(n^{\log_{1{,}5}{3}}) \approx O(n^{2.71}).
Поразрядная сортировка — Сложность алгоритма: O(n·k); требуется O(k)
дополнительной памяти.
Цифровая сортировка — то же, что и Поразрядная сортировка.
[править] Непрактичные алгоритмы сортировки
Bogosort — O(n·n!) в среднем. Произвольно перемешать массив, проверить порядок.
Сортировка перестановкой — O(n·n!) — худшее время. Для каждой пары
осуществляется проверка верного порядка и генерируются всевозможные перестановки
исходного массива.
Глупая сортировка (Stupid sort) — O(n3); рекурсивная версия требует
дополнительно O(n2) памяти
Bead Sort — O(n) or O(√n), требуется специализированное аппаратное обеспечение
Блинная сортировка (Pancake sorting) — O(n), требуется специализированное
аппаратное обеспечение
[править] Алгоритмы, не основанные на сравнениях
Блочная сортировка (Корзинная сортировка, Bucket sort)
Лексикографическая или поразрядная сортировка (Radix sort)
Сортировка подсчётом (Counting sort)
[править] Прочие алгоритмы сортировки
Топологическая сортировка
Внешняя сортировка