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

11.3. Изучение сортировки алгоритмической линзы 527

перестановки P1 и P2 S связаны с тем же самым внешним узлом, тогда там

по крайней мере два объекта xi и x j, такой, что xi прежде x j в P1, но xi после x j в P2. В то же время продукция, связанная с v, должна быть определенным переупорядочением S, или с xi или с x j появляющийся перед другим. Но если P1 и P2 оба заставляют алгоритм сортировки производить элементы S в этом заказе, то это подразумевает, что есть способ обмануть алгоритм в произведение xi и x j в неправильном заказе. Так как это не может быть позволено правильным алгоритмом сортировки, каждый внешний узел T должен быть связан точно с одной перестановкой S. Мы используем эту собственность дерева решений, связанного с алгоритмом сортировки, чтобы доказать следующий результат. Суждение 11.4: продолжительность любого основанного на сравнении алгоритма для вида - луг, последовательность n-элемента -W (n регистрируют n) в худшем случае. Оправдание: Продолжительность основанного на сравнении алгоритма сортировки должна быть больше, чем или равной высоте дерева решений T связанный с этим алгоритмом, как описано выше. (См. рисунок 11.15.) Аргументом выше, каждый внешний узел в T должен быть связан с одной перестановкой S. Кроме того, каждая перестановка S должна привести к различному внешнему узлу T. Число

перестановки объектов n - n! = n (n- 1) (n- 2) 2 1. Таким образом T должен иметь, по крайней мере,

n! внешние узлы. Суждением 7.10, высота T - по крайней мере, регистрация (n!). Это

немедленно оправдывает суждение, потому что есть, по крайней мере, n/2 условия, которые больше, чем или равны n/2 в продукте n!; следовательно

n

регистрация (n!)³ регистрируют n 2 = n регистрируют n, 2 2 2

который являетсяW (n, регистрируют n).

Рисунок 11.15: Визуализация более низкого направляющегося в основанную на сравнении сортировку.

528

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

11.3.2 Линейно-разовая сортировка: вид ведра и вид корня

В предыдущей секции мы показали, чтоW (n регистрируют n) время необходим, в худшем случае, чтобы сортировать последовательность n-элемента с основанным на сравнении алгоритмом сортировки. Естественный вопрос спросить, затем, состоит в том, есть ли другие виды сортировки алгоритмов, которые могут быть разработаны, чтобы бежать асимптотически быстрее, чем O (n, регистрируют n), время. Интерес - ingly, такие алгоритмы существуют, но они требуют, чтобы были сортированы специальные предположения о входной последовательности. Несмотря на это, такие сценарии часто возникают на практике, так обсуждение их стоит. В этой секции мы рассматриваем проблему сортировки последовательности записей, каждый пара значения ключа, где у ключей есть ограниченный тип.

Вид ведра

Рассмотрите последовательность S n записей, ключи которых - целые числа в диапазоне [0, N- 1],

для некоторого целого числа N³ 2, и предполагают, что S должен быть сортирован согласно ключам

из записей. В этом случае это возможно к виду S в O (n + N) время. Это могло бы казаться

удивляя, но это подразумевает, например, что, если N - O (n), то мы можем сортировать S в O (n) время. Конечно, критический момент - то, что из-за строгого предположения о формате элементов мы можем избегать использования сравнений.

Главная идея состоит в том, чтобы использовать алгоритм, названный видом ведра, который не основан на сравнениях, но на использовании ключей, поскольку индексы в ведро выстраивают B, у которого есть клетки в -

dexed от 0 до N- 1. Вход с ключом k помещен в «ведро» B [k], который

самостоятельно последовательность (записей с ключом k). После вставки каждого входа входа

последовательность S в ее ведро, мы можем отложить записи в S в сортированном заказе enu-

merating содержание ведер B [0], B[1]..., B [N- 1] в заказе. Мы описываем

алгоритм вида ведра в Кодовом Фрагменте 11.8.

Алгоритм bucketSort (S):

Вход: Последовательность S записей с целым числом вводит диапазон [0, N- 1]

Продукция: Последовательность S сортированный в неуменьшающемся заказе ключей

позвольте B быть множеством последовательностей N, каждая из которых первоначально пуста для каждого входа e в S, делают

k¬ e.key ()

удалите e из S и вставьте его в ведре конца (последовательность) B [k]

поскольку я¬ 0 к N- 1 делаю

для каждого входа e в последовательности B [я] делаю

удалите e из B [я] и вставьте его в конце S

Кодовый фрагмент 11.8: вид ведра.