- •Алгоритмы и структуры данных
- •Лекция 1 Тема 1.1. Критерии оценки алгоритмов
- •1.1.1. Асимптотические характеристики
- •Временная оценка (оценка порядка)
- •Общий случай определения временной сложности
- •Тема 1.2. Классификация алгоритмов по степени сложности
- •Виды функций оценки сложности алгоритмов
- •Экспериментальный метод оценки трудоемкости (сложности) алгоритма
- •Оценка пространственной (емкостной) сложности
- •Линейные структуры данных
- •Иерархические структуры данных
- •Сетевые структуры данных
- •Табличные структуры данных
- •Представление данных в памяти эвм
- •Базовые алгоритмы обработки данных
- •Тема 2.2. Алгоритмы обработки данных линейной структуры
- •3. Алгоритмы сортировки
- •3.1. Основные определения и классы алгоритмов
- •Наиболее распространенные простые алгоритмы внутренней сортировки (массивов)
- •Сортировка вставками
- •Сортировка выбором
- •3.2.3. Сортировка обменом (Пузырьковая сортировка)
- •3.2.4.Сортировка Шейкером
- •Эффективные методы внутренней сортировки
- •Сортировка Шелла
- •3.3.2. Быстрая сортировка
- •3.4.3. Сортировка Боуза - Нельсона
3.4.3. Сортировка Боуза - Нельсона
Главным минусом предыдущих методов является удвоение размера памяти, первоначально занятой сортируемыми данными. Алгоритм Боуза – Нельсона является рекурсивным и не требует дополнительной памяти, т.е. упорядочение выполняется на месте исходного массива. Он основан на простой идее: слить две равные по размеру упорядоченные части можно слиянием их начальных, конечных половин, а также слиянием середин (2-й половины 1-го результата с 1-й половиной 2-го результата). Эта процедура иллюстрируется рисунком.
Если части не равны или не делятся точно пополам, процедуру уточняют соответствующим образом. Аналогично слияние «половинок» можно свести к слиянию «четвертушек», «восьмушек» и т. д. Таким образом, становится очевидной необходимость использования рекурсии.
Рисунок. Иллюстрация слияния частей двух серий
Обозначим r - расстояние между началами сливаемых частей, m - их размер и j - наименьший номер элемента. Будем считать, что выполняется сортировка по возрастанию.
Рекурсивный алгоритм сортировки Боуза- Нельсона
Слияние
Начало рекурсии. Если j+r ≤ n, то
Если m = 1, то
Если A[j] > A[j+r], то
Поменять местами A[i] и A[j+r].
Иначе
m = m / 2.
Выполнить Слияние «начал» от j до m с расстоянием r.
Если j+r+m ≤ n, то
Выполнить Слияние «концов» от j+m до m с расстоянием r.
Выполнить Слияние «центральной части» от j+m до m с расстоянием m - r.
Основная часть рекурсии
m = 1.
Повторять
Цикл слияния списков равного размера
j = 1.
Пока j+m ≤n
1) Выполнить Слияние (j,m,m);
2) j = j + 2m
2.3.3. Удвоение размера списка перед началом нового прохода
m = 2m.
Конец цикла 2.2, реализующего все слияния
Пока m < n.
Число сравнений и пересылок при реализации сортировки методом Боуза - Нельсона в самом худшем случае пропорционально n log n, т.е. сложность алгоритма O(n log n). Дополнительная память, как уже отмечалось, не требуется.
