- •Содержание
- •Введение.
- •1. Основы анализа алгоритмов
- •1.1. Сравнительные оценки алгоритмов
- •1.2. Элементарные операции в формальной системе
- •1.3. Классы входных данных
- •1.4. Классификация алгоритмов по виду функции трудоемкости
- •1.5. Классификация скоростей роста. Асимптотический анализ функций
- •1. Оценка (тета)
- •2. Оценка о (о большое)
- •3. Оценка (Омега)
- •1.6. Эффективность рекурсивных алгоритмов
- •1.7. Анализ программ
- •1.8. Вопросы для самоконтроля
- •Классификация алгоритмов по виду функции трудоемкости.
- •2. Алгоритмы поиска и выборки
- •2.1. Последовательный поиск
- •2.2. Двоичный поиск
- •2.3. Задача выборки
- •2.4. Вопросы для самоконтроля
- •3.Алгоритмы сортировки
- •3.1. Сортировка трех чисел по месту
- •3.2. Сортировка вставками
- •3.3. Пузырьковая сортировка
- •3.4. Сортировка Шелла.
- •3.5. Корневая сортировка
- •3.6. Сортировка методом индексов
- •3.7. Быстрая сортировка (алгоритм Хоара)
- •3.8. Вопросы для самоконтроля
- •Сортировка Шелла.
- •Сортировка методом индексов.
- •4. Алгоритмы на графах
- •4.1. Основные понятия теории графов
- •4.2. Структуры данных для представления графов
- •4.3. Алгоритмы обхода вершин графа
- •4.3.1. Обход в глубину
- •4.3.2. Обход в ширину
- •4.4. Поиск остовного дерева минимального веса
- •4.4.1. Алгоритм Дейкстры – Прима
- •4.4.2. Алгоритм Крускала
- •4.5. Алгоритм поиска кратчайшего пути
- •4.6. Вопросы для самоконтроля
- •Структуры данных для представления графов.
- •5. Численные методы
- •5.1. Вычисление значений многочленов
- •5.2. Умножение матриц
- •5.2.1 Стандартный алгоритм умножения матриц
- •5.2.2. Умножение матриц по Винограду
- •5.2.3. Умножение матриц по Штрассену
- •5.3. Вопросы для самоконтроля
- •Стандартный алгоритм умножения матриц.
- •6. Алгоритмы сравнения с образцами
- •6.1. Сравнение строк
- •6.2. Алгоритм Кнута – Морриса – Пратта
- •6.3. Алгоритм Бойера - Мура
- •6.4. Вопросы для самоконтроля
- •7. Вычислительная геометрия
- •7.1. Основные понятия
- •7.2. Векторное произведение векторов
- •7.2.1. Ориентированная площадь треугольника
- •7 .3. Задача о выпуклой оболочке
- •7.3.1. Алгоритм Грэхема
- •7.3.2. Алгоритм Джарвиса
- •7.3.3. Рекурсивный алгоритм
- •7.4. Вопросы для самоконтроля
- •8. Задачи класса np
- •8.1. Примеры np-полных задач
- •8.1.1. Задача о коммивояжере
- •8.1.2. Задача о раскраске графа
- •8.1.3. Раскладка по ящикам
- •8.1.4 Упаковка рюкзака
- •8.1.5. Задача о суммах элементов подмножества
- •8.1.6. Задача о планировании работ
- •8.2. Приближенные эвристические решения nр-полных задач.
- •8.2.1. Жадные приближенные алгоритмы
- •8.2.2. Приближения в задаче коммивояжера
- •8.2.3. Приближения в задаче о раскладке по ящикам
- •8.2.4. Приближения в задаче об упаковке рюкзака
- •8.3. Вопросы для самопроверки
- •Приближения в задаче об упаковке рюкзака.
- •9. Динамическое программирование
- •Часть1--------------------
- •10. Метод ветвей и границ
- •Вопросы к зачету
- •Классификация алгоритмов по виду функции трудоемкости.
- •Приближения в задаче об упаковке рюкзака.
- •Динамическое программирование
- •Метод ветвей и границ. Литература
3.3. Пузырьковая сортировка
Основной принцип пузырьковой сортировки состоит в выталкивании маленьких значений на вершину списка, в то время как большие значения опускаются вниз. У пузырьковой сортировки есть много различных вариантов.
Алгоритм пузырьковой сортировки совершает несколько проходов по списку. При каждом проходе происходит сравнение соседних элементов. Если порядок соседних элементов неправильный (инверсия), то они меняются местами. Каждый проход начинается с начала списка. Сначала сравниваются первый и второй элементы, затем 2 и 3, потом 3 и 4 и т.д. Элементы с неправильным порядком в паре переставляются.
При обнаружении на первом проходе максимального элемента, он будет переставляться со всеми последующими элементами, пока не дойдет до конца списка. Поэтому при втором проходе нет необходимости производить сравнение с последним элементом. При втором проходе второй по величине элемент переместится во вторую позицию с конца.
При продолжении процесса на каждом проходе, по крайней мере, одно из следующих по величине значений встает на свое место. При этом меньшие значения тоже собираются в начале. Если при каком-то проходе не произошло ни одной перестановки, то все элементы стоят в нужном порядке и процесс можно остановить.
При каждом проходе к своему месту продвигаются сразу несколько элементов, хотя гарантировано занимает свое положение лишь один.
BubbleSort (A, N)
// A - сортируемый список
// N - число элементов
К N
swap_el true
while swap_el do
К К - 1
swap_el false
For i=1 to К do
if a[i] > a[i+1] then
Swap a[i], a[i+1]
swap_el true
endif
endfor
endwhile
end
Проведем анализ наихудшего случая: список идет в обратном порядке – на последнем месте минимальный элемент. На первом проходе будет (N - 1) операций сравнений и перестановки, на втором проходе (N-2) – сравнений и перестановок, что в сумме дает:
fА(N) = =
Асимптотическая оценка fА(N) = O (N2/2)
Пример 3.2 Пузырьковая сортировка
7 3 9 4 2 5 6 1 8 -- исходный список
1 проход – 8 сравнений, 7 перестановок
(7 3) 9 4 2 5 6 1 8
3 (7 9) 4 2 5 6 1 8
3 7 (9 4) 2 5 6 1 8
3 7 4 (9 2) 5 6 1 8
3 7 4 2 (9 5) 6 1 8
3 7 4 2 5 (9 6) 1 8
3 7 4 2 5 6 (9 1) 8
3 7 4 2 5 6 1 (9 8)
3 7 4 2 5 6 1 8 9
2 проход: 7 сравнений, 5 перестановок
(3 7) 4 2 5 6 1 8 9
3 (7 4) 2 5 6 1 8 9
3 4 (7 2) 5 6 1 8 9
3 4 2 (7 5) 6 1 8 9
3 4 2 5 (7 6) 1 8 9
3 4 2 5 6 (7 1) 8 9
3 4 2 5 6 1 (7 8) 9
3 проход: 6 сравнений, 2 перестановки
(3 4) 2 5 6 1 7 8 9
3 (4 2) 5 6 1 7 8 9
3 2 (4 5) 6 1 7 8 9
3 2 4 (5 6) 1 7 8 9
3 2 4 5 (6 1) 7 8 9
3 2 4 5 1 (6 7) 8 9
и т.д.
Еще один вариант пузырьковый сортировки - нечетные и четные проходы выполняются в противоположных направлениях: нечетные - в том же направлении, что и в исходном варианте, а четные - от конца массива к его началу. При нечетных проходах большие элементы сдвигаются к концу массива, а при четных - меньшие элементы сдвигаются к его началу. (Алгоритм и оценку худшего случая сформируйте самостоятельно).