7. Сортировка
Чтобы воспользоваться эффективными алгоритмами поиска, данные должны
быть упорядочены в том или ином порядке, иначе говоря, отсортированы.
Сортировка (или упорядочение), также как и поиск, является одной из
часто используемых при обработке данных операций и применяется ко многим структурам
данных: массивам, связным спискам, деревьям и графам.
Существуют свидетельства, что первой программой для ЭВМ с хранимой программой (с архитектурой Джона фон Неймана) была именно программа сортировки.
Классификация алгоритмов сортировки
Количество алгоритмов сортировки достаточно велико. В книге Дональда Кнута "Искусство программирования для ЭВМ" рассматривается более двадцати (~25) алгоритмов сортировки. В настоящее время это число ещё больше увеличилось, и, вместе с экзотическими и мало распространёнными алгоритмами, приближается к 40 (и даже уже превышает 40, а с модификациями ещё больше, 42-44, скорее всего и эти цифры заниженные). Все эти алгоритмы можно классифицировать по нескольким признакам.
1. В зависимости от того, сортируются данные в оперативной памяти машины (ОЗУ) или во внешнем ЗУ, сортировка бывает внутренней или внешней.
2. В зависимости от того, какая структура данных подвергается сортировке, может быть сортировка бывает массива, связного списка, дерева (пирамиды), графа.
3. В зависимости от того, как структура данных меняется в процессе сортировки может быть сортировка списка (если элементы структуры данных перемещаются), или сортировка таблицы адресов (если элементы не перемещаются, а сортируется имеющаяся или создаваемая таблица адресов). В таблицу адресов могут быть добавлены ключи, тогда получается сортировка таблицы ключей.
4. По особенностям функциональной реализации алгоритмы сортировки делятся на группы:
Основные:
− сортировка перестановками (обменная);
− сортировка выбором (отбором);
− сортировка вставками;
Неосновные:
− сортировка подсчетом;
− сортировка слиянием;
− распределяющая сортировка.
5. По широте применения − универсальные (большинство перечисленных выше групп алгоритмов) и алгоритмы для конкретных случаев, не универсальные.
6. По признаку перестановки совпадающих данных в процессе сортировки − алгоритмы, не меняющие порядок следования совпадающих ключей (иногда такие алгоритмы не совсем удачно называют "устойчивыми" или "стабильными"), например, сортировка вставками, и меняющие порядок следования ("неустойчивые").
7. По характеру зависимости времени работы от размера N структуры данных:
− O(N2) − N‐квадратичные (это самые простые
алгоритмы из 1-х трёх функциональных групп);
− O(Nk), где 1<k<2 (например, k = 1,6667 или
k = 1,5 или k = 1,27 и т.п. − это алгоритм Шелла);
возможен также случай, когда k = 3 − это один из самых неудачных и неэффективных
алгоритмов, который получил название глупая сортировка (или дурацкая
сортировка);
− O(log2N) − логарифмические (например, быстрая сортировка
или пирамидальная сортировка).
Возможны также некоторые другие принципы разделения алгоритмов сортировки.
Большинство алгоритмов имеет модификации. В книге Дональда Кнута упоминаются более двадцати алгоритмов внутренней сортировки и их комбинации.
При таком большом разнообразии важными оказываются
критерии выбора алгоритма:
− средняя скорость сортировки (среднее время, удельная скорость);
− скорость в лучшем и худшем случаях (или минимальное и максимальное время);
− естественность поведения;
− переставляются ли элементы с совпадающими значениями (ключами).
Скорость (или время) сортировки определяется количеством операций сравнения и перестановки.
У разных алгоритмов время работы находится в экспоненциальной или логарифмической зависимости от числа
элементов структуры данных (массива) N.
Лучший случай − это ситуация, когда структура данных уже отсортирована в нужном порядке,
худший случай − структура данных отсортирована в порядке, обратном требуемому.
Время в лучшем и худшем случаях важны, если возможно частое повторение одной из этих
ситуации. Часто при хорошей средней скорости алгоритмы имеют неприемлемую скорость
в худшем случае.
Естественность поведения означает, что если массив уже упорядочен, должно выполняться
минимальное число операций (в идеале 0). Максимальное число операций выполняется,
если массив отсортирован в обратном порядке.
Кроме перечисленных критериев при выборе алгоритма следует принимать во
внимание:
− размер структуры данных, которую предстоит сортировать (некоторые алгоритмы,
высокоэффективные в средних случаях, например быстрая сортировка, не показывают
своей высокой эффективности для массивов малого размера);
− степень исходной упорядоченности сортируемых данных;
− требования к необходимой памяти (разным алгоритмам может требоваться
O(1), O(N) или O(N2) памяти машины);
− трудоёмкость реализации алгоритма в сравнении со сложность решаемой в
программе задачи (например, пирамидальная сортировка
является одним из самых сложных алгоритмов).