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

6.4. Тематическое исследование: вид пузыря на последовательности 259

6.4 Тематическое исследование: вид пузыря на последовательности

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

6.4.1 Алгоритм вида пузыря

Считайте последовательность n элементов таким образом, что любые два элемента в последовательности могут быть сравнены согласно отношению заказа (например, компании, сравненные доходом, государства, сравненные населением или словами, сравненными лексикографически). Проблема сортировки состоит в том, чтобы переупорядочить последовательность так, чтобы элементы были в не - уменьшающий заказ. Алгоритм вида пузыря (см. рисунок 6.8) решает эту проблему, выполняя серию, передает по последовательности. В каждом проходе элементы просмотрены, увеличив разряд от разряда 0 до конца последовательности. В каждом положении в проходе элемент по сравнению с его соседом, и если эти два, довод «против» - secutive элементы, как находят, находится в неправильном относительном заказе (то есть, предыдущий элемент больше, чем последующий), то эти два элемента обменяны. Последовательность сортирована, закончив n такие проходы.

проход

обмены

последовательность

(5, 7, 2, 6, 9, 3)

1-й

7 «2 7 «6 9 «3

(5, 2, 6, 7, 3, 9)

2-й

5 «2 7 «3

(2, 5, 6, 3, 7, 9)

3-й

6 «3

(2, 5, 3, 6, 7, 9)

4-й

5 «3

(2, 3, 5, 6, 7, 9)

Рисунок 6.8: алгоритм вида пузыря на последовательности целых чисел. Для каждого прохода обмены выступили и последовательность после того, как проход показывают.

У алгоритма вида пузыря есть следующие свойства:

• В первом проходе, когда-то самый большой элемент достигнут, он продолжает обмениваться

пока это не добирается до последнего положения последовательности.

• Во втором проходе, когда-то второй по величине элемент достигнут, он сохраняет

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

• В целом, в конце прохода ith, самое правое я элементы последовательности

(то есть, те в индексах от n- 1 вниз к n- i), находятся в заключительном положении.

Последняя собственность подразумевает, что это правильно, чтобы ограничить число проходов, сделанных видом пузыря на последовательности n-элемента к n. Кроме того, это позволяет проход ith в

будьте ограничены первым n- я + 1 элемент последовательности.

260

Глава 6. Список и Iterator adTs

6.4.2 Основанный на последовательности анализ вида пузыря

Предположите, что внедрение последовательности таково что доступы к ele-

монетные дворы и обмены элементов, выполненных видом пузыря, берут O (1) время каждый.

Таким образом, продолжительность прохода ith - O (n- я + 1). У нас есть это полное

продолжительность вида пузыря

n

O å1 (n-i + 1) .i =

Мы можем переписать сумму в большом о примечании как

n + (n- 1) + + 2 + 1 =å i. i=1

Суждением 4.3, мы имеем

n

å1i = n (n + 1). n

i = 2

Таким образом вид пузыря управляет в O (n2) временем, при условии, что доступы и обмены могут каждый быть осуществлены в O (1) время. Как мы видим в будущих главах, эта работа для сортировки довольно неэффективна. Мы обсуждаем алгоритм вида пузыря здесь. Наша цель состоит в том, чтобы продемонстрировать, не как пример хорошего алгоритма сортировки.

Кодовые Фрагменты 6,19 и 6,20 существующих два внедрения вида пузыря на последовательности целых чисел. Параметр S имеет Последовательность типа, но мы не определяем, является ли это основанным на узле или основанным на множестве внедрением. Два внедрения вида пузыря отличаются по предпочтительному выбору функций получить доступ и изменить последовательность. Первое основано на доступе к элементам их индексом. Мы используем функцию atIndex, чтобы получить доступ к двум элементам интереса.

Начиная с функции bubbleSort1 элементы доступов только через основанные на индексе интерфейсные функции atIndex, это внедрение подходит только для основанного на множестве внедрения последовательности, для которой atIndex берет O (1) время. Учитывая такую основанную на множестве последовательность, это внедрение вида пузыря управляет в O (n2) временем.

С другой стороны, если бы мы использовали наше основанное на узле внедрение se-айвы, каждое требование atIndex взяло бы O (n) время в худшем случае. Начиная с этого func-tion называют с каждым повторением внутренней петли, вся функция управляла бы в O (n3) временем худшего случая, которое является довольно медленным, если n большой.

В отличие от bubbleSort1, наша вторая функция, bubbleSort2, получает доступ к el - ements полностью с помощью iterators. iterators prec и succ играют

роли, которые индексы j - 1 и jиграют, соответственно, в bubbleSort1. Наблюдайте это когда

мы сначала входим во внутреннюю петлю bubbleSort1, ценность j- 1 0, то есть, это относится

к первому элементу последовательности. Это - то, почему мы инициализируем prec к началу