Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

500 Глава 11. Сортировка, наборы и выбор

11.1 Вид слияния

В этой секции мы представляем метод сортировки, названный видом слияния, который может быть описан в простом и компактном способе использовать рекурсию.

11.1.1 Делить-и-побеждать

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

1. Разделитесь: Если входной размер меньше, чем определенный порог (скажите, один или два

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

2. Повторитесь: рекурсивно решите подпроблемы, связанные с подмножествами. 3. Завоюйте: Возьмите решения подпроблем и «слейте» их в a

решение оригинальной проблемы.

Используя делить-и-побеждать для сортировки

Вспомните, что в проблеме сортировки нам дают последовательность объектов n, хранивших в связанном списке или множестве, вместе с некоторым компаратором, определяющим полный заказ на эти объекты, и нас просят произвести заказанное представление этих объектов. Чтобы допускать сортировку любого представления, мы описываем наш алгоритм сортировки в высоком уровне для последовательностей и объясняем, что детали должны были осуществить его для связанных списков и множеств. Чтобы сортировать последовательность S с n элементами, используя три «делятся, и» завоевывают шаги, доходы алгоритма вида слияния следующим образом:

1. Разделитесь: Если у S есть ноль или один элемент, возвратите S немедленно; это уже

сортированный. Иначе (S имеет по крайней мере два элемента), удалите все элементы из S и поместите их в две последовательности, S1 и S2, каждый содержащий о

половина элементов S; то есть, S1 содержит первыйn/2 ⌉ элементы S,

и S2 содержит остающийсяn/2 ⌋ элементы.

2. Повторитесь: рекурсивно последовательности вида S1 и S2.

3. Завоюйте: Отложите элементы в S, слив сортированные последовательности S1

и S2 в сортированную последовательность.

В отношении шага дележа мы вспоминаем, что примечаниеx ⌉ указывает на потолок

из x, то есть, самое маленькое целое число m, такой, что x£ m. Точно так же примечаниеx ⌋указывает на floor x, то есть, самое большое целое число k, такой что k£ x.

11.1. Вид слияния 501

Мы можем визуализировать выполнение алгоритма вида слияния посредством набора из двух предметов

дерево T, названный деревом вида слияния. Каждый узел T представляет рекурсивную просьбу (или требование) алгоритма вида слияния. Мы связываем последовательность S, который обработан просьбой, связанной с v с каждым узлом v T. Дети узла v связаны с рекурсивными вызовами, которые обрабатывают подпоследовательности S1 и S2 S. Внешние узлы T связаны с отдельными элементами S, соответствуя случаям алгоритма, которые не сделали никаких рекурсивных звонков.

Рисунок 11.1 суммирует выполнение алгоритма вида слияния, показывая последовательности входа и выхода, обработанные в каждом узле дерева вида слияния. Постепенному развитию дерева вида слияния показывают 11.2 в цифрах до 11,4.

Эта визуализация алгоритма с точки зрения дерева вида слияния помогает нам проанализировать продолжительность алгоритма вида слияния. В частности начиная с размера входной последовательности примерно половины в каждом рекурсивном вызове вида слияния, высота дерева вида слияния о регистрации n (вспомните, что основа регистрации равняется 2, если опущено).

(a)

(b)

Рисунок 11.1: дерево вида слияния T для выполнения алгоритма вида слияния на a

последовательность с восемью элементами: (a) входные последовательности обработан в каждом узле T; (b) последовательности продукции произведен в каждом узле T.