Интросорт - Introsort

Интросорт
КлассАлгоритм сортировки
Структура данныхМассив
Худший случай спектакльO (п журнал п)
Средний спектакльO (п журнал п)

Интросорт или интроспективная сортировка это гибридный алгоритм сортировки который обеспечивает как высокую среднюю производительность, так и (асимптотически) оптимальную производительность в худшем случае. Это начинается с быстрая сортировка, он переключается на heapsort когда глубина рекурсии превышает уровень, основанный на ( логарифм of) количество сортируемых элементов и переключается на вставка сортировки когда количество элементов ниже некоторого порога. Он сочетает в себе хорошие части трех алгоритмов с практической производительностью, сопоставимой с быстрой сортировкой на типичных наборах данных и в худшем случае. О (п журнал п) время выполнения из-за сортировки кучи. Поскольку он использует три алгоритма: виды сравнения, это тоже сортировка для сравнения.

Introsort был изобретен Дэвид Массер в Мюссер (1997), в котором он также представил интроселект, гибрид алгоритм выбора на основе быстрый выбор (вариант быстрой сортировки), который возвращается к медиана медиан и, таким образом, обеспечивает оптимальную линейную сложность в наихудшем случае. Оба алгоритма были введены с целью предоставления общие алгоритмы для Стандартная библиотека C ++ которые имели как высокую среднюю производительность, так и оптимальную производительность в худшем случае, что позволило ужесточить требования к производительности.[1] Introsort - это на месте и не стабильный.[2]

Псевдокод

Если реализация heapsort и функции секционирования типа обсуждаемых в быстрая сортировка статьи доступны, интросорт можно кратко описать как

процедура sort (A: массив): позволять maxdepth = ⌊log (длина (A)) ⌋ × 2 introsort (A, maxdepth)процедура интросорт (A, maxdepth): n ← length (A) если п ≤ 1: вернуть  // базовый вариант    иначе если maxdepth = 0: heapsort (A) еще: p ← перегородка (A) // предполагаем, что эта функция делает выбор точки поворота, p - конечная позиция точки поворота        интросорт (A [0: p-1], maxdepth - 1) интросорт (A [p + 1: n], maxdepth - 1)

Коэффициент 2 для максимальной глубины является произвольным; его можно настроить для практического использования. А[я:j] обозначает срез массива предметов я к j.

Анализ

В быстрой сортировке одной из критических операций является выбор точки поворота: элемента, вокруг которого разбивается список. Простейший алгоритм выбора точки поворота состоит в том, чтобы взять за основу первый или последний элемент списка, что приведет к плохому поведению в случае отсортированного или почти отсортированного ввода. Никлаус Вирт Вариант использует средний элемент, чтобы предотвратить эти вхождения, вырождаясь в O (п2) для надуманных последовательностей. Алгоритм выбора точки поворота по медиане-3 берет медианное значение для первого, среднего и последнего элементов списка; однако, несмотря на то, что это хорошо работает на многих реальных входных данных, все же можно придумать убийца среднего из трех список, который вызовет резкое замедление быстрой сортировки, основанной на этой технике выбора поворота.

Массер сообщил, что для убийственной последовательности из 100000 элементов в среднем из 3 время выполнения интросорта было 1/200 от времени выполнения быстрой сортировки в среднем из 3. Мюссер также рассмотрел влияние на тайники из Sedgewick отложенная небольшая сортировка, при которой небольшие диапазоны сортируются в конце за один проход вставка сортировки. Он сообщил, что это может удвоить число промахов кеша, но его производительность с двусторонние очереди был значительно лучше и должен быть сохранен для библиотек шаблонов, отчасти потому, что в других случаях выгода от немедленной сортировки была невелика.

Реализации

Интросорт или какой-либо его вариант используется в ряде стандартная библиотека функции сортировки, включая некоторые C ++ сортировка реализации.

Июнь 2000 г. SGI C ++ Стандартная библиотека шаблонов stl_algo.h реализация нестабильная сортировка использует подход Musser introsort с глубиной рекурсии, чтобы переключиться на heapsort, переданную в качестве параметра, выбор точки поворота по медиане из 3 и окончательный проход сортировки вставкой Knuth для разделов меньше 16.

В Стандартная библиотека GNU C ++ аналогично: использует интросорт с максимальной глубиной 2 × log2 п, за которым следует вставка сортировки на перегородках меньше 16.[3]

В Microsoft .NET Framework Библиотека классов, начиная с версии 4.5 (2012), вместо простой быстрой сортировки используется интросорт.[4]

Идти использует интросорт с небольшой модификацией: для срезов из 12 или менее элементов он использует Shellsort вместо того вставка сортировки, и более продвинутая медиана трех медиан из трех выбранных опорных точек для быстрой сортировки.

использованная литература

Общее

  • Musser, Дэвид Р. (1997). «Алгоритмы интроспективной сортировки и отбора». Программное обеспечение: практика и опыт. 27 (8): 983–993. Дои:10.1002 / (SICI) 1097-024X (199708) 27: 8 <983 :: AID-SPE117> 3.0.CO; 2- #.CS1 maint: ref = harv (ссылка на сайт)
  • Никлаус Вирт. Алгоритмы и структуры данных. Prentice-Hall, Inc., 1985. ISBN  0-13-022005-1.