- •Сортировки
- •Введение
- •Формулировка задачи сортировки
- •Простейшие методы сортировки
- •Алгоритм линейной сортировки (метод прямого выбора)
- •1 Способ 2 способ
- •Алгоритм сортировки обменом (метод "Пузырька")
- •Усовершенствованная "пузырьковая" сортировка
- •"Шейкер" - сортировка
- •Сортировка подсчетом
- •Алгоритм сортировки вставками (метод прямого включения)
- •Размещение путем сравнения и обмена (просеивание)
- •Размещение путем поиска места и вставки
- •Более сложные и более эффективные методы сортировки
- •Алгоритм сортировки Шелла (метод h-сортировки)
- •Обменная сортировка с разделением (сортировка Хоара)
- •Сортировка методом слияний
- •Простое слияние
- •Естественное двухпутевое слияние
- •Рекурсивный алгоритм слияния
- •Слияние списков
- •Алгоритм сортировки бинарными вставками
- •Сортировка с помощью двоичного включения
- •Лексикографическая сортировка
- •Топологическая сортировка
- •Поразрядная сортировка
- •Пирамидальная сортировка
- •Рекурсивная сортировка
- •Сравнительная характеристика методов сортировки
- •Классификация задач с применением сортировок
- •1. Задачи заполнения
- •2. Задачи анализа
- •3. Задачи поиска
- •4. Задачи перестановки
- •Литература
Формулировка задачи сортировки
Введем некоторые понятия и обозначения.
Частичным порядком на множестве S называется такое бинарное отношение , что для любых a, b и c из S выполняются следующие условия:

Пример 1. Отношение ≤ на множестве целых чисел (1≤2≤…≤n).
Пример 2. Отношение включения множеств:
{0}{1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}.

Отношение порядка “<”на множестве ключей вводится таким образом, чтобы для любых трех значений ключей a, b, c были выполнены условия:
-
справедливо одно и только одно из соотношений a < b, a = b, a > b
-
если a < b, и b < c, то a < c (транзитивность).
Сформулируем более четко задачу сортировки. Пусть надо упорядочить N элементов
X1, X2, ..., Xn.
Назовем их записями, выбранными из множества, на котором задан линейный порядок.
Каждая запись Xj имеет ключ Kj, который и управляет процессом сортировки. Помимо ключа запись может содержать дополнительную информацию, которая не влияет на процесс сортировки, но всегда присутствует в этой записи.
Требуется найти такую перестановку записей p1, p2, ..., pn, после которой ключи расположились бы в неубывающем порядке:
Kp(1) Kp(2) ... Kp(n).
Сортировка называется устойчивой, если она удовлетворяет дополнительному условию, что записи с одинаковыми ключами остаются в прежнем порядке (предполагается, что элементы уже были отсортированы по некоторому вторичному ключу):
pi pj для любых Kp(i) Kp(j) и i < j.
В ряде случаев требуется физически перемещать записи в памяти так, чтобы ключи были упорядочены; в других случаях достаточно создать вспомогательную таблицу, которая некоторым образом описывает перестановку и обеспечивает доступ к записям в соответствии с порядком ключей.
Некоторые методы сортировки предполагают наличие элементов и -. Величина считается строго больше, а - строго меньше любого ключа:
- < Ki < для всех 1<= i <=N .
Эти величины используются в качестве граничных признаков.
Обычно сортировку подразделяют на два класса: внутреннюю и внешнюю. При внутренней сортировки все записи хранятся в оперативной памяти, таким образом, как правило, это сортировка массивов. При внешней сортировке – записи хранятся на внешнем запоминающем устройстве, это сортировка файлов.
Задача сортировки может быть решена разнообразными алгоритмами, при построении которых используются многие фундаментальные приемы и методы. Выбор алгоритма зависит от структуры обрабатываемых данных.
Основное требование к методам сортировки – экономное использование доступной памяти. Это означает, что переупорядочение нужно выполнять «на том же месте», то есть методы пересылки элементов из одного массива в другой не представляют интереса.
Все методы сортировок будем классифицировать по их экономичности, т.е. по времени их работы.
Удобной мерой эффективности является подсчет числа С - необходимых сравнений ключей и М – пересылок (перестановок) элементов.
Достаточно хороший алгоритм затрачивает на сортировку N записей время порядка N*log(N). Простейшие алгоритмы сортировки которые мы рассмотрим в этой главе, обладают характеристикой порядка N2. Если N достаточно мало, то простые алгоритмы достаточно выгодно использовать в силу простоты их реализации.
Анализ методов сортировки очень полезен и с точки зрения обучения, так как с их помощью можно наглядно проиллюстрировать самые разные ситуации. По словам создателя языка Паскаль, Н. Вирта, "создается впечатление, что можно построить целый курс программирования, выбирая примеры только из задач сортировки".
Интересен этот класс алгоритмов еще и тем, что на нем наглядно демонстрируются богатейшие возможности программирования: насколько разными путями можно прийти к одной цели - получение упорядоченного массива! На множестве алгоритмов сортировки становится понятной необходимость сравнительного анализа алгоритмов и оценки их качества, критериями которого являются увеличение быстродействия и экономии памяти.
Практически каждый алгоритм сортировки можно разбить на три части:
- сравнение, определяющее упорядоченность пары элементов;
- перестановку, меняющую местами пару элементов;
- собственно сортирующий алгоритм, который осуществляет сравнение и перестановку элементов до тех пор, сока все элементы множества не будут упорядочены.
