Новосибирский Государственный Университет
Опубликован: 08.11.2006 | Доступ: свободный | Студентов: 1877 / 92 | Оценка: 4.27 / 4.09 | Длительность: 12:16:00
Специальности: Программист
Лекция 14:

Сортировка (часть 1)

< Лекция 13 || Лекция 14: 12 || Лекция 15 >
Аннотация: Введение. Внутренняя сортировка. Вставка. Обменная сортировка.

Введение

Рассматриваемые здесь задачи можно отнести к наиболее часто встречающимся классам комбинаторных задач. Почти во всех машинных приложениях множество объектов должно быть переразмещено в соответствии с некоторым заранее определенным порядком. Например, при обработке коммерческих данных часто бывает необходимо расположить их по алфавиту или по возрастанию номеров. В числовых расчетах иногда требуется знать наибольший корень многочлена, и т.д.

Будем считать заданной таблицу с n именами, обозначаемыми x_1, x_2,\ldots,x_n. Каждое имя x_i принимает значение из пространства имен, на котором определен линейный порядок. Будем считать, что никакие два имени не имеют одинаковых значений; то есть любые x_i^{},x_j обладают тем свойством, что если i \ne j, то либо x_i  < x_j, либо x_i  > x_j. Ограничение x_i  \ne x_j при i \ne j упрощает анализ без потери общности, ибо и при наличии равных имен корректность идей и алгоритмов не нарушается. Наша цель состоит в том, чтобы выяснить что- нибудь относительно перестановки \Pi=(\pi_1,\pi_2,\ldots,\pi_n) для которой x_{\pi _1 }  < x_{\pi _2 }  < \ldots  < x_{\pi _n
}. В задаче полной сортировки требуется полностью определить \Pi, хотя обычно это делается неявно путем переразмещения имени в порядке возрастания. В задачах частичной сортировки требуется либо извлечь частичную информацию о \Pi (например, \Pi_i для нескольких значений i ), либо полностью определить \Pi по некоторой заданной частичной информации о ней (так обстоит дело при слиянии двух упорядоченных таблиц).

При внутренней сортировке решается задача полной сортировки для случая достаточно малой таблицы, умещающейся непосредственно в адресной памяти. Внешняя сортировка представляет собой задачу полной сортировки для случая такой большой таблицы, что доступ к ней организован по частям, расположенным на внешних запоминающих устройствах. Частичная сортировка - задачи выбора i - наибольшего имени и слияния двух упорядоченных таблиц.

Внутренняя сортировка

Существует по крайней мере пять широких классов алгоритмов внутренней сортировки.

  1. Вставка. На i -м этапе i -е имя помещается на надлежащее место между i - 1 уже отсортированным именами:

  1. Обмен. Два имени, расположение которых не соответствует порядку, меняются местами (обмен). Эти процедуры повторяются до тех пор, пока остаются такие пары.

  1. Выбор. На i -м этапе из неотсортированных имен выбирается i -е наибольшее (наименьшее) имя и помещается на соответствующее место.

  1. Распределение. Имена распределяются по группам, и содержимое групп затем объединяется таким образом, чтобы частично отсортировать таблицу; процесс повторяется до тех пор, пока таблица не будет отсортирована полностью.
  2. Слияние. Таблица делится на подтаблицы, которые сортируются по отдельности и затем сливаются в одну.

Эти классы нельзя назвать ни взаимоисключающими, ни исчерпывающими: одни алгоритмы сортировки можно с полным основанием отнести более чем к одному классу (пузырьковую сортировку можно рассматривать и как выбор, и как обмен), а другие не укладываются ни в один из классов. Тем не менее, перечисленные пять классов достаточно удобны для классификации обсуждаемых алгоритмов сортировки.

Сосредоточим внимание на первых четырех классах алгоритмов сортировки. Алгоритмы, основанные на слиянии, приемлемы для внутренней сортировки, но более естественно рассматривать их как методы внешней сортировки.

В описываемых алгоритмах сортировки имена образуют последовательность, которую будем обозначать x_1,x_2,\ldots,x_n независимо от возможных пересылок данных; таким образом, значением x_i является любое текущее имя в i -й позиции последовательности. Многие алгоритмы сортировки наиболее применимы к массивам; в этом случае x_i обозначает i -й элемент массива. Другие алгоритмы более приспособлены для работы со связанными списками: здесь x_i обозначает iэлемент списка. Следующие обозначения используются для пересылок данных:

x_i  \leftrightarrow x_j значения x_i и x_j меняются местами. x_i  \leftarrow y значение y присваивается имени x_i. y \leftarrow x_j значение имени x_j присваивается y.

Таким образом, операция x_i  \leftarrow x_j, которая встречается в различных алгоритмах сортировки, временно нарушает предположение о том, что никакие два имени не имеют одинаковых значений. Однако это условие всегда обязательно восстанавливается.

В каждом из рассматриваемых алгоритмов будем считать, что имена нужно сортировать на месте. Другими словами, переразмещение имен должно происходить внутри последовательности x_1,x_2,\ldots,x_n ; при этом существуют одна или две дополнительные ячейки, в которых временно размещается значение имени. Ограничение "на месте" основано на предположении, будто число имен настолько велико, что во время сортировки не допускается перенос их в другую область памяти. Если в распоряжении имеется память, достаточная для такого переноса, то некоторые из обсуждаемых алгоритмов можно значительно ускорить. Эти рассмотрения заставляют нас в алгоритмах распределяющей сортировки и сортировки слиянием реализовать последовательность x_1,x_2,\ldots,x_n как связанный список.

Вставка

Вставка - простейшая сортировка вставками проходит через этапы j = 2,3,\ldots,n: на этапе j имя x_j вставляется на свое правильное место среди x_1,x_2,\ldots,x_{j - 1}.

Простая сортировка вставками, используемая на таблице из n = 5 имен. Пунктирные вертикальные линии разделяют уже отсортированную часть таблицы и еще не отсортированную

Рис. 14.1. Простая сортировка вставками, используемая на таблице из n = 5 имен. Пунктирные вертикальные линии разделяют уже отсортированную часть таблицы и еще не отсортированную

При вставке имя x_j временно размещается в X, и просматриваются имена x_{j - 1},x_{j - 2},\ldots,x_i ; они сравниваются с X и сдвигаются вправо, если обнаруживается, что они больше X. Имеется фиктивное имя x_0, значение которого - \infty служит для остановки просмотра слева. На рис. 14.1 работа этого алгоритма проиллюстрирована на примере таблицы из пяти имен.

Алгоритм 14.1. Простая сортировка вставками

Алгоритм 14.1. Простая сортировка вставками

Эффективность этого алгоритма, как и большинства алгоритмов сортировки, зависит от числа сравнений имен и числа пересылок данных, осуществляемых в трех случаях : худшем, среднем (в предположении, что все n! перестановок равновероятны) и лучшем.

< Лекция 13 || Лекция 14: 12 || Лекция 15 >
Андрей Посохов
Андрей Посохов
Россия, Санкт-Петербург
Вадим Лелес
Вадим Лелес
Россия