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

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

< Лекция 14 || Лекция 15: 12 || Лекция 16 >
Аннотация: Выбор. Распределяющая сортировка. Цифровая распределяющая сортировка. Внешняя сортировка. Частичная сортировка. Частичная сортировка (выбор). Частичная сортировка (слияние).

Выбор

В сортировке посредством выбора основная идея состоит в том, чтобы идти по шагам i = 1,2,\ldots,n, находя i -е наибольшее (наименьшее) имя и помещая его на его место на i -ом шаге. Простейшая форма сортировки выбором представлена алгоритмом 15.1: i -е наибольшее имя находится очевидным способом просмотром оставшихся n - i + 1 имен. Число сравнений имен на i -ом шаге равно n - i, что приводит к общему числу сравнений имен (n - 1) + (n - 2) + \ldots  + 1 = \frac{1} {2}n(n -
1) независимо от входа, поэтому ясно, что это не очень хороший способ сортировки.

Алгоритм 15.1. Простая сортировка выбором

Алгоритм 15.1. Простая сортировка выбором

Несмотря на неэффективность алгоритма 15.1, идея выбора может привести и к эффективному алгоритму сортировки. Весь вопрос в том, чтобы найти более эффективный метод определения i -го наибольшего имени, чего можно добиться, используя механизм турнира с выбыванием. Суть его такова: сравниваются x_1 :x_2,x_3 :x_4,x_5 :x_6,\ldots,x_{n - 1}
:x_n, затем сравниваются "победители" (то есть большие имена) этих сравнений и т.д.; эта процедура для n = 16 показана на рис. 15.1. Заметим, что для определения наибольшего имени этот процесс требует n -
1 сравнений имен; но, определив наибольшее имя, мы обладаем большим объемом информации о втором по величине (в порядке убывания) имени: оно должно быть одним из тех, которые "потерпели поражение" от наибольшего имени. Таким образом, второе по величине имя теперь можно определить, заменяя наибольшее имя на - \infty и вновь осуществляя сравнение вдоль пути от наибольшего имени к корню. На рис. 15.2 эта процедура показана для дерева из рис. 15.1.

Идея турнира с выбыванием прослеживается при сортировке весьма отчетливо, если имена образуют пирамиду. Пирамида - это полностью сбалансированное бинарное дерево высоты h, в котором все листья находятся на расстоянии h или h - 1 от корня и все потомки узла меньше его самого; кроме того, в нем все листья уровня максимально смещены влево. На рис. 15.3 показано множество имен, организованных в виде пирамиды. Чтобы получить удобное линейное представление дерева, пирамиду можно хранить по уровням в одномерном массиве: сыновья имени из i -ой позиции есть имена в позициях 2i и 2i +
1. Таким образом, пирамида, представленная на рисунке 15.3, принимает вид

\begin{center}
\begin{tabular}{ccccccccccccc}
i:   &  1 &   2 &   3 &   4   & 5 &   6
&   7  &  8  &  9  &  10 &   11 &  12\\
x_i &  94 & 93 & 75 & 91 & 85 & 44 &
51 & 18 & 48 & 58  & 10 &   34
\end{tabular}
\end{center}

Заметим, что в пирамиде наибольшее имя должно находиться в корне и, таким образом, всегда в первой позиции массива, представляющего пирамиду. Обмен местами первого имени с n -м помещает наибольшее имя в его правильную позицию, но нарушает свойство пирамидальности в первых n - 1 именах. Если мы можем сначала построить пирамиду, а затем эффективно восстановить ее, то все в порядке, так как тогда можно производить сортировку следующим образом: построить пирамиду из x_1,x_2,\ldots,x_n,


Это общее описание пирамидальной сортировки.

Использование турнира с выбыванием для отыскания наибольшего имени.Путь наибольшего имени показан жирной линией

Рис. 15.1. Использование турнира с выбыванием для отыскания наибольшего имени.Путь наибольшего имени показан жирной линией

Рис. 15.2.

Процедура RESTORE (j,k) восстановления пирамиды из последовательности x_j,x_{j + 1},\ldots,x_k в предположении, что все поддеревья суть пирамиды, такова:


Переписывая это итеративным способом и дополняя деталями, мы получим алгоритм 15.2.

Алгоритм 15.2.Восстановление пирамиды из дерева, поддеревья которого суть пирамиды

Алгоритм 15.2.Восстановление пирамиды из дерева, поддеревья которого суть пирамиды
Пирамида, содержащая 12 имен

Рис. 15.3. Пирамида, содержащая 12 имен
Алгоритм 15.3.Пирамидальная сортировка

Алгоритм 15.3.Пирамидальная сортировка

Распределяющая сортировка

Обсуждаемый здесь алгоритм сортировки отличается от рассматривавшихся до сих пор тем, что он основан не на сравнениях между именами, а на представлении имен. Мы полагаем, что каждое из имен x_1,x_2,\ldots,x_n имеет вид

x_i  = (x_{i,p},x_{i,p - 1},\ldots,x_{i,1} )
и их нужно отсортировать в возрастающем лексикографическом порядке, то есть
x_i  = (x_{i,p},x_{i,p - 1},\ldots,x_{i,1} ) < (x_{j,p}^,,x_{j,p -
1},\ldots,x_{j,1} ) = x_j
тогда и только тогда, если для некоторого t \leqslant p имеем x_{i,l}  = x_{j,l} для l > t и x_{i,t}  < x_{j,t}. Для простоты будем считать, что 0
\leqslant x_{i,l}  < r, и поэтому имена можно рассматривать как целые, представленные по основанию r, так что каждое имя имеет p r -ичных цифр. Более короткие имена дополняются нулями.

Цифровая распределяющая сортировка

Цифровая распределяющая сортировка основана на наблюдении, что если имена уже отсортированы по младшим разрядами l,l - 1,\ldots,1, то их можно полностью отсортировать, сортируя только по старшим разрядам p,p -
1,\ldots,i + 1 при условии, что сортировка осуществляется таким образом, чтобы не нарушить относительный порядок имен с одинаковыми цифрами в старших разрядах. Заметим, что к самой таблице обращаются по правилу "первым включается – первым исключается", и поэтому лучшим способом представления являются очереди. В частности, предположим, что с каждым ключом x_i ассоциируется поле связи LINK_i ; тогда эти поля связи можно использовать для сцепления всех имен в таблице вместе во входную очередь Q. При помощи полей связи можно также сцеплять имена в очереди Q_0,Q_1,\ldots,Q_{r - 1}, используемые для представления стопок. После того как имена распределены по стопкам, очереди, представляющие эти стопки, связываются вместе для получения вновь таблицы Q. Алгоритм 15.4. представляет эту процедуру в общих чертах (очереди описаны в "Алгоритмы на абстрактных структурах данных" ). В результате применения алгоритма очередь Q будет содержать имена в порядке возрастания; то есть имена будут связаны в порядке возрастания полями связи, начиная с головы очереди Q.

Использовать поля связи LINK_1,\ldots LINK_n для формирования x_1,\ldots,x_n во входную очередь Q

Алгоритм 15.4.Цифровая распределяющая сортировка

Алгоритм 15.4.Цифровая распределяющая сортировка
< Лекция 14 || Лекция 15: 12 || Лекция 16 >