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

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

(a) (b)

(c) (d)

(e) (f)

Рисунок 11.2: Визуализация выполнения вида слияния. Каждый узел дерева представляет рекурсивный вызов вида слияния. Узлы, оттянутые с пунктирными линиями repre-, послали звонки, которые еще не были сделаны. Узел, оттянутый с толстыми линиями, представляет текущее требование. Пустые узлы, оттянутые с тонкими линиями, представляют законченные требования. Остающиеся узлы (оттянутый с тонкими линиями и не пустые) представляют требования, которые ждут детской просьбы, чтобы возвратиться. (Продолжается в рисунке 11.3.)

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

(g) (h)

(i) (j)

(k) (l)

Рисунок 11.3: Визуализация выполнения вида слияния. (Продолжается в Фиге - ure 11.4.)

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

(m) (n)

(o) (p)

Рисунок 11.4: Визуализация выполнения вида слияния. Несколько просьб опущены между (l) и (m) и между (m) и (n). Отметьте побеждать шаг за - сформированный в шаге (p). (Продолженный от рисунка 11.3.)

Суждение 11.1: дерево вида слияния связалось с выполнением слияния -

у вида на последовательности размера n есть высота⌈log n ⌉.

Мы оставляем оправдание Суждения 11.1 как простое упражнение (R-11.4). Мы

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

Дав обзор вида слияния и иллюстрацию того, как это работает, давайте считать каждый из шагов этого алгоритма делить-и-побеждать в большем количестве de - хвостом. Дележ и повторяется, шаги алгоритма вида слияния просты; деление a

последовательность размера n включает отделение его в элементе синдексом n/2 ⌉, и

рекурсивные вызовы просто включают прохождение этих меньших последовательностей как параметры.

трудный шаг - побеждать шаг, который сливает две сортированных последовательности в единственную сортированную последовательность. Таким образом, прежде чем мы представляем наш анализ вида слияния, мы должны сказать больше о том, как это сделано.

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

11.1.2 Слияние множеств и списков

Чтобы слить две сортированных последовательности, полезно знать, осуществлены ли они как

множества или списки. Мы начинаем с внедрения множества, которое мы показываем в Кодовом Фрагменте 11.1. Мы иллюстрируем шаг в слиянии двух сортированных множеств в рисунке 11.5.

Слияние алгоритма (S1, S2, S):

Вход: Сортированный S1 последовательностей и S2 и пустая последовательность S, все из которых

осуществленный как Продукция множеств: Сортированная последовательность S содержащий элементы от S1 и S2

j¬0

в то время как я <S1.size () и j <S2.size () делаю

если S1 [я]£ S2 [j] тогда

S.insertBack (S1 [я])копируют ith элемент S1 к концу Sя¬ i+1

еще

S.insertBack (S2[j]) копируют jth элемент S2 к концу S

j¬ j+1

в то время как я <S1.size () делаюткопируют остающиеся элементы S1 к S

S.insertBack (S1 [я])

я¬ i+1

в то время как j <S2.size () делаюткопируют остающиеся элементы S2 к S

S.insertBack (S2[j])

j¬ j+1

Кодовый Фрагмент 11.1: Алгоритм для слияния двух сортированных основанных на множестве последовательностей.

(a) (b)

Рисунок 11.5: шаг в слиянии двух сортированных множеств: (a) перед шагом копии; (b) после шага копии.