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

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

Теперь рассмотрите след рекурсии для рандомизированного быстрого вида. Этот след определяет двоичное дерево, T, такой, что каждый узел в T соответствует различному рекурсивному вызову на подпроблеме сортировки части оригинального списка.

Скажите, что узел v в T находится в группе i размера, если размер подпроблемы v больше, чем (3/4) i+1n и в большинстве (3/4) в. Давайте проанализируем потраченную работу ожидаемого времени над всеми подпроблемами для узлов в группе i размера. Линейностью ожидания (Предлагают 19), ожидаемое время для работы над всеми этими подпроблемами - сумма ожидаемых времен для каждого. Некоторые из этих узлов соответствуют хорошим требованиям, и некоторые соответствуют плохим требованиям. Но обратите внимание на то, что, так как хорошее требование происходит с вероятностью 1/2, ожидаемое число последовательных звонков, которые мы должны сделать прежде, чем получить хорошее требование, равняется 2. Кроме того, заметьте, что, как только у нас есть хороший призыв к узлу в группе i размера, ее дети будут в группах размера выше, чем я. Таким образом, для любого элемента x из входного списка, ожидаемого числа узлов в группе размера я содержащий x в их подпроблемах являюсь 2. Другими словами, ожидаемый полный размер всех подпроблем в группе размера я 2n. Так как нерекурсивная работа, которую мы выполняем для любой подпроблемы, пропорциональна ее размеру, это подразумевает, что полное ожидаемое время потратило обработку подпроблем для узлов в группе размера, я - O (n).

Число групп размера - log4/3 n, начиная с повторного умножения на 3/4

то же самое как повторное деление на 4/3. Таким образом, число групп размера - O (зарегистрируйте n). Поэтому, полная ожидаемая продолжительность рандомизированного быстрого вида - O (n, регистрируют n). (См. рисунок 11.13.)

Рисунок 11.13: визуальный анализ времени дерева быстрого вида T. Каждый узел показывают маркированный размером его подпроблемы.

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

11.2. Быстрый вид 523

11.2.2 C ++ внедрения и оптимизация

Вспомните из Раздела 8.3.5, что алгоритм сортировки оперативный, если это использует только небольшое количество памяти в дополнение к необходимому для объектов, сортируемых их - сам. Алгоритм вида слияния, как описано выше, не использует этот optimiza-tion техника, и создание его быть оперативным, кажется, довольно трудное. Оперативный вид - луг не неотъемлемо трудный, как бы то ни было. Поскольку, как с видом кучи, быстрый вид может быть адаптирован, чтобы быть оперативным, и это - версия быстрого вида, который используется в наиболее развернутых внедрениях.

Выполнение оперативного алгоритма быстрого вида требует небольшого количества изобретательности, как - когда-либо, поскольку мы должны использовать саму входную последовательность, чтобы сохранить подпоследовательности для всех рекурсивных вызовов. Мы показываем алгоритм inPlaceQuickSort, который выполняет оперативный быстрый вид в Кодовом Фрагменте 11.6. Алгоритм inPlaceQuickSort предполагает, что входная последовательность, S, дана как множество отличных элементов. Причина этого ограничения исследуется в Упражнении R-11.15. Расширение к общему случаю обсуждено в Упражнении C-11.9.

Алгоритм inPlaceQuickSort (S, a, b):

Вход: множество S отличных элементов; целые числа a и Продукция b: Выстройте S с элементами первоначально от индексов от до b, включительно,

сортированный в неуменьшающемся заказе от индексов a до b

если³ b тогда возвращается Самое большее один элемент в поддиапазоне

p¬ S [b] Центрl¬a Просмотрит направоr¬ b-1 Просмотрит влево

в то время как l£ r делают

считают элемент больше, чем центр, в то время как l£ r и S [l]£ p делают

l¬ l+1 считают элемент меньшим, чем центр, в то время как r³ l и S[r] ³ p делают

r¬ r-1

если l <r тогда

обменяйте элементы в S [l] и S[r]

помещают центр в его заключительное место

обменяйте элементы в S [l] и S [b]



inPlaceQuickSort (S, a, l- 1)

inPlaceQuickSort (S, l + 1, b)

мы сделаны в этом пункте, так как сортированные подмножества уже последовательны

Кодовый Фрагмент 11.6: оперативный быстрый вид для входа выстраивает S.

524