Комбинаторные алгоритмы для программистов

          

Выбор


В сортировке посредством выбора основная идея состоит в том, чтобы идти по шагам

Выбор
, находя
Выбор
-е наибольшее (наименьшее) имя и помещая его на его место на
Выбор
-ом шаге. Простейшая форма сортировки выбором представлена алгоритмом 15.1:
Выбор
-е наибольшее имя находится очевидным способом просмотром оставшихся
Выбор

имен. Число сравнений имен на

Выбор
-ом шаге равно
Выбор
, что приводит к общему числу сравнений имен
Выбор

независимо от входа, поэтому ясно, что это не очень хороший способ сортировки.

Выбор

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

Несмотря на неэффективность алгоритма 15.1, идея выбора может привести и к эффективному алгоритму сортировки. Весь вопрос в том, чтобы найти более эффективный метод определения

Выбор
-го наибольшего имени, чего можно добиться, используя механизм турнира с выбыванием. Суть его такова: сравниваются
Выбор
, затем сравниваются "победители" (то есть большие имена) этих сравнений и т.д.; эта процедура для
Выбор
показана на рис. 15.1.

Заметим, что для определения наибольшего имени этот процесс требует

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

Идея турнира с выбыванием прослеживается при сортировке весьма отчетливо, если имена образуют пирамиду. Пирамида - это полностью сбалансированное бинарное дерево высоты

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

Выбор


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

Выбор


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

Выбор

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

Выбор

Рис. 15.2.  Отыскание второго наибольшего имени путем замены наибольшего имени на
Выбор
. Проведение повторного сравнения имен, побежденных наибольшим именем

Процедура RESTORE
Выбор
восстановления пирамиды из последовательности
Выбор
в предположении, что все поддеревья суть пирамиды, такова:

Выбор


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

Выбор

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

Выбор

Рис. 15.3.  Пирамида, содержащая 12 имен

Выбор

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


Содержание раздела