Сортировка (часть 2)
Выбор
В сортировке посредством выбора основная идея состоит в том, чтобы
идти по шагам , находя
-е
наибольшее (наименьшее)
имя и помещая его на его место на
-ом шаге. Простейшая форма
сортировки выбором представлена алгоритмом 15.1:
-е наибольшее
имя
находится очевидным способом просмотром оставшихся
имен. Число
сравнений имен на
-ом шаге равно
, что
приводит к общему числу
сравнений имен
независимо от входа, поэтому ясно, что это не очень хороший способ
сортировки.
Несмотря на неэффективность алгоритма 15.1, идея выбора может привести
и к эффективному алгоритму сортировки. Весь вопрос в том, чтобы найти
более эффективный метод определения -го наибольшего имени, чего
можно добиться, используя механизм турнира с выбыванием. Суть его
такова: сравниваются
, затем сравниваются "победители" (то есть большие
имена) этих
сравнений и т.д.; эта процедура для
показана на рис. 15.1.
Заметим, что для определения наибольшего имени этот процесс требует
сравнений имен; но, определив наибольшее имя, мы обладаем большим
объемом информации о втором по величине (в порядке убывания) имени: оно
должно быть одним из тех, которые "потерпели поражение" от
наибольшего имени. Таким образом, второе по величине имя теперь можно определить,
заменяя наибольшее имя на
и вновь осуществляя сравнение
вдоль пути от наибольшего имени к корню. На рис. 15.2 эта процедура показана для
дерева из рис. 15.1.
Идея турнира с выбыванием прослеживается при сортировке весьма отчетливо,
если имена образуют пирамиду. Пирамида
- это полностью сбалансированное бинарное дерево высоты , в котором все листья находятся на
расстоянии
или
от корня и все потомки узла
меньше его самого; кроме того, в нем все листья уровня
максимально смещены влево. На рис. 15.3 показано множество имен, организованных
в виде пирамиды. Чтобы получить удобное линейное представление дерева, пирамиду
можно хранить по уровням в одномерном массиве: сыновья имени из
-ой позиции есть имена в позициях
и
. Таким образом, пирамида, представленная на рисунке 15.3, принимает
вид

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

Рис. 15.1. Использование турнира с выбыванием для отыскания наибольшего имени.Путь наибольшего имени показан жирной линией
Процедура RESTORE восстановления пирамиды из
последовательности
в предположении, что
все поддеревья суть пирамиды, такова:
Переписывая это итеративным способом и дополняя деталями, мы получим алгоритм 15.2.
Распределяющая сортировка
Обсуждаемый здесь алгоритм сортировки отличается от рассматривавшихся до
сих пор тем, что он основан не на сравнениях между именами, а на представлении
имен. Мы полагаем, что каждое из имен имеет
вид










Цифровая распределяющая сортировка
Цифровая распределяющая сортировка основана на наблюдении, что если имена
уже отсортированы по младшим разрядами , то их
можно полностью отсортировать, сортируя только по старшим разрядам
при условии, что сортировка осуществляется таким
образом, чтобы не нарушить
относительный порядок имен с одинаковыми цифрами в старших разрядах. Заметим,
что к самой таблице обращаются по правилу "первым включается – первым
исключается", и поэтому лучшим способом представления являются очереди. В
частности, предположим, что с каждым ключом
ассоциируется
поле связи
; тогда эти поля связи можно использовать для
сцепления всех имен в таблице вместе
во входную очередь
. При помощи полей связи можно также сцеплять
имена в очереди
, используемые для
представления стопок. После того как имена распределены по
стопкам, очереди, представляющие эти стопки, связываются вместе для получения
вновь таблицы
. Алгоритм 15.4. представляет эту процедуру в
общих чертах (очереди описаны в
"Алгоритмы на абстрактных структурах данных"
).
В результате применения алгоритма очередь
будет
содержать имена в порядке возрастания; то есть имена будут связаны в порядке
возрастания полями связи, начиная с головы очереди
.