Сортировка Шелла
Сортировка Шелла (англ. Shell sort) — алгоритм сортировки, являющийся усовершенствованным вариантом сортировки вставками. Идея метода Шелла состоит в сравнении элементов, стоящих не только рядом, но и на определённом расстоянии друг от друга. Иными словами — это сортировка вставками с предварительными «грубыми» проходами. Аналогичный метод усовершенствования пузырьковой сортировки называется сортировка расчёской.
Содержание |
[править] Описание
При сортировке Шелла сначала сравниваются и сортируются между собой значения, отстоящие один от другого на некотором расстоянии d (о выборе значения d см. ниже). После этого процедура повторяется для некоторых меньших значений d, а завершается сортировка Шелла упорядочиванием элементов при d = 1 (то есть обычной сортировкой вставками). Эффективность сортировки Шелла в определённых случаях обеспечивается тем, что элементы «быстрее» встают на свои места (в простых методах сортировки, например, пузырьковой, каждая перестановка двух элементов уменьшает количество инверсий в списке максимум на 1, а при сортировке Шелла это число может быть больше).
Невзирая на то, что сортировка Шелла во многих случаях медленнее, чем быстрая сортировка, она имеет ряд преимуществ:
- отсутствие потребности в памяти под стек;
- отсутствие деградации при неудачных наборах данных — быстрая сортировка легко деградирует до O(n²), что хуже, чем худшее гарантированное время для сортировки Шелла.
[править] История
Сортировка Шелла была названа в честь её изобретателя — Дональда Шелла, который опубликовал этот алгоритм в 1959 году. В некоторых старых пособиях этот алгоритм назывался Сортировка Шелл-Мецнер, в честь Марлен Мецнер-Нортон[источник не указан 387 дней]. Однако, впоследствии, сама Мецнер опровергла это: «Я не имею ничего общего с этой сортировкой, и моё имя никогда не должно связываться с ней»[источник не указан 387 дней].
[править] Пример
Пусть дан список A = (32,95,16,82,24,66,35,19,75,54,40,43,93,68) и выполняется его сортировка методом Шелла, а в качестве значений d выбраны 5,3,1.
На первом шаге сортируются подсписки A, составленные из всех элементов A, различающихся на 5 позиций, то есть подсписки A5,1 = (32,66,40), A5,2 = (95,35,43), A5,3 = (16,19,93), A5,4 = (82,75,68), A5,5 = (24,54).
В полученном списке на втором шаге вновь сортируются подсписки из отстоящих на 3 позиции элементов.
Процесс завершается обычной сортировкой вставками получившегося списка.
[править] Выбор длины промежутков
Среднее время работы алгоритма зависит от длин промежутков — d, на которых будут находиться сортируемые элементы исходного массива ёмкостью N на каждом шаге алгоритма. Существует несколько подходов к выбору этих значений:
- первоначально используемая Шеллом последовательность длин промежутков:
в худшем случае, сложность алгоритма составит cN2; - предложенная Хиббардом последовательность: все значения
; такая последовательность шагов приводит к алгоритму сложностью O(N3 / 2); - предложенная Седжвиком последовательность:
, если i четное и
, если i нечетное. При использовании таких приращений средняя сложность алгоритма составляет: O(n7 / 6), а в худшем случае порядка O(n4 / 3). При использовании формулы Седжвика следует остановиться на значении inc[s-1], если 3*inc[s] > size.[1]; - предложенная Праттом последовательность: все значения
; в таком случае сложность алгоритма составляет O(N(logN)2); - эмпирическая последовательность Марцина Циура (последовательность A102549 в OEIS):
; является одной из лучших для сортировки массива ёмкостью приблизительно до 4000 элементов.[2]; - эмпирическая последовательность, основанная на числах Фибоначчи:
; - все значения
[источник не указан 791 день],
; такая последовательность шагов приводит к алгоритму сложностью O(N3 / 2).
[править] Примечания
- ↑ J. Incerpi, R. Sedgewick, «Improved Upper Bounds for Shellsort», J. Computer and System Sciences 31, 2, 1985.
- ↑ Marcin Ciura Best Increments for the Average Case of Shellsort
[править] Ссылки
- Д. Кнут. Искусство программирования. Том 3. Сортировка и поиск, 2-е изд. Гл. 5.2.1. ISBN 5-8459-0082-4
- Анимированное представление алгоритма сортировки Шелла
- Представление алгоритма сортировки Шелла в виде танца (видео)
|
|
|
|---|---|
| Теория | Сложность алгоритма • О-нотация • Отношение порядка • Устойчивая • Внутренняя • Внешняя |
| Обменные | Пузырьком • Перемешиванием • Гномья • Быстрая • Расчёской |
| Выбором | Выбором • Пирамидальная |
| Вставками | Вставками • Шелла • Деревом |
| Слиянием | Слиянием • Без дополнительной памяти |
| Без сравнений | Подсчётом • Поразрядная • Блочная |
| Гибридные | Introsort • Timsort |
| Прочее | Топологическая • Сети |
| Непрактичные | Bogosort • Stooge sort • Глупая • Блинная |
в худшем случае, сложность алгоритма составит
; такая последовательность шагов приводит к алгоритму сложностью
, если i четное и
, если i нечетное. При использовании таких приращений средняя сложность алгоритма составляет:
; в таком случае сложность алгоритма составляет
; является одной из лучших для сортировки массива ёмкостью приблизительно до 4000 элементов.
;
; такая последовательность шагов приводит к алгоритму сложностью