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

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

пустота bubbleSort1 (Sequence& S)

интервал n = S.size ();

для (интервал i = 0; я <n; я ++)

для (интервал j = 1; j <n-i; j ++)

Последовательность:: Iterator prec = S.atIndex(j-1);

Последовательность:: Iterator succ = S.atIndex (j);

//вид пузыря индексами

//проход i-th

//предшественник//преемник

если (*prec> *succ)

//обменяйтесь если не в порядке

интервал tmp = *prec; *prec = *succ; *succ = tmp;

Кодовый Фрагмент 6.19: C ++ внедрения вида пузыря, основанного на индексах.

из последовательности прежде, чем войти во внутреннюю петлю. Каждый раз, когда мы повторно входим во внутреннюю петлю, мы инициализируем succ к prec и затем немедленно увеличиваем ее. Таким образом succ немедленно относится к положению после prec. Прежде, чем возобновить петлю, мы увеличиваем prec.

пустота bubbleSort2 (Sequence& S)

интервал n = S.size ();

//вид пузыря положениями

для (интервал i = 0; я <n; я ++)

Последовательность:: Iterator prec = S.begin ();

//i-th проходят//предшественник

для (интервал j = 1; j <n-i; j ++)

Последовательность:: Iterator succ = prec;

+ + s ucc;

//преемник

если (*prec> *succ)

//обменяйтесь если не в порядке

интервал tmp = *prec; *prec = *succ; *succ = tmp;

++ prec;

//передовой предшественник

Кодовый Фрагмент 6.20: Два C ++ внедрения вида пузыря.

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

Два внедрения вида пузыря, данные выше шоу важность про - viding эффективные внедрения ADTs. Тем не менее, несмотря на его implementa-tion простота, вычислительные исследователи обычно чувствуют, что алгоритм вида пузыря не хороший метод сортировки, потому что, даже если осуществленный самым лучшим способом, это все еще занимает время. Действительно, есть намного более эффективные алгоритмы сортировки, которые бегут в O (n, регистрируют n), время. Мы исследуем их в Главах 8 и 11.

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

6.5 Упражнения

Для помощи с упражнениями, пожалуйста, посетите веб-сайт, www.wiley.com/college/goodrich. <www.wiley.com/college/goodrich>

Укрепление

R-6.1 R-6.2 R-6.3 R-6.4

R-6.5

R-6.6

R-6.7

R-6.8

R-6.9

R-6.10

R-6.11

R-6.12

R-6.13

Дайте C ++ кодовый фрагмент для изменения множества. Дайте C ++ кодовый фрагмент для того, чтобы беспорядочно переставить множество. Дайте C ++ кодовый фрагмент для циркулярного вращения множества расстоянием d. Потяните представление первоначально пустого вектора после выполнения следующей последовательности операций: вставка (0, 4), вставка (0, 3), вставка (0, 2),

вставка (2, 1), вставка (1, 5), вставка (1, 6), вставка (3, 7), вставка (0, 8). Дайте класс адаптера, чтобы поддержать интерфейс Stack, используя функции вектора ADT. Обеспечьте недостающие вспомогательные функции (скопируйте конструктора, назначьте - ment оператор и печь для сжигания отходов производства) для класса ArrayVector Кодового Frag-ment 6.2. Обеспечьте полностью универсальную версию класса ArrayVector Кодового Frag-ment 6.2, используя templated класс. Дайте templated C ++ сумма функции (v), который возвращает сумму элементов в векторе STL v. Используйте STL iterator, чтобы перечислить элементы v. Предположите, что тип элемента v - любой числовой тип, который поддерживает + оператор. Перепишите оправдание Суждения 6.2 под предположением, что затраты на рост множества от размера k к размеру 2k являются 3k кибердолларами. Сколько должно каждый выдвинуть операцию быть приказанным заставить амортизацию работать? Нарисуйте картины, иллюстрирующие каждый из главных шагов в алгоритмах для вставки функций (p, e), insertFront (e), и insertBack (e) Кодового Frag-ment 6.5. Обеспечьте полностью универсальную версию класса NodeList Кодового Фрагмента 6,9 использований templated класса. Обеспечьте недостающие вспомогательные функции (скопируйте конструктора, назначьте - ment оператор и печь для сжигания отходов производства) для класса NodeList, который был пред - sented в Кодовом Фрагменте 6.9. В нашем внедрении iterator для класса NodeList в Кодовом Frag-ment 6.7 мы определили только оператора перед приращением. Предоставьте определение оператору постприращения.