- •Основные понятия структур
- •Концепция типа данных, простейшие типы данных, стандартные типы данных, органические типы (диапазоны)
- •Статические и полустатические структуры данных
- •2. 1. Массив.
- •2. 2. Запись, записи с вариантами.
- •2. 3. Стек.
- •5. Очередь
- •2. 7. Отображение
- •Динамические структуры данных
- •3.1. Односвязные списки, кольцевой список
- •3. 2. Двусвязный список, кольцевой двусвязный список
- •4. Рекурсивные алгоритмы
- •4. 1. Деревья, бинарные деревья, представление деревьев
- •4. 2. Основные операторы, используемые для работы с деревьями
- •4. 3. Алгоритм создания дерева бинарного поиска
- •4. 4. Прохождение бинарных деревьев
- •1. Прохождение в прямом порядке
- •3. Прохождение в обратном порядке
- •4. 5. Когда рекурсию использовать не нужно
- •4. 6. Рекурсивные программы, примеры
- •5. Поиск
- •5. 1. Линейный поиск
- •5. 2. Двоичный поиск
- •5. 3. Индексно-последовательный поиск
- •5. 3. Поиск в таблице
- •5. 4. Поиск прямой строки
- •Поиск по бинарному дереву
- •Алгоритм кнута, Морриса и Пратта
- •5. 6. Алгоритм Боуера и Мура
- •Сортировка. Необходимые определения и классификация сортировок. Сортировки прямого включения и выбора. Их эффективность Необходимые определения и классификация сортировок.
- •Сортировка методом прямого включения
- •Эффективность алгоритма сортировки прямого включения
- •Сортировка методом прямого выбора
- •Эффективность алгоритма сортировки прямого выбора
- •Сортировка прямого обмена. Её эффективность
- •Эффективность алгоритма сортировки прямого обмена
- •Улучшенные методы сортировки. Быстрая сортировка. Её эффективность.
- •Быстрая сортировка
- •Принцип работы быстрой сортировки
- •Пример работы быстрой сортировки
- •Блок-схема быстрой сортировки
- •Улучшенные методы сортировки. Сортировка шелла. Её эффективность. Сортировка шелла
- •Принцип работы сортировки шелла и необходимые расчёты для её реализации
- •Пример расчёта последовательности расстояний для малых массивов
- •Пример работы сортировки шелла
- •Принцип работы пирамидальной сортировки
- •Пример работы пирамидальной сортировки
- •Представление графов
- •Нахождение кратчайших путей между парами вершин
Улучшенные методы сортировки. Сортировка шелла. Её эффективность. Сортировка шелла
Сортировка шелла базируется на алгоритме прямой вставки. Исходный массив своеобразным образом разбивается на части, которые и сортируются многократно алгоритмом прямого включения. Эти разбиения помогают сократить количество перестановок, так как чтобы освободить нужное место для очередного элемента, необходимо сдвигать меньше элементов.
Принцип работы сортировки шелла и необходимые расчёты для её реализации
Необходимо на каждом шаге произвести определённые действия, если t – это переменная, которая хранит номер этого шага. Сначала определяются все подпоследовательности, в которых расстояния между элементами равно kt. Далее каждая из этих подпоследовательностей сортируется методом прямого включения.
Сложным и важным местом данного алгоритма является нахождение убывающей последовательности расстояний kt, kt-1..., k1. Она должна обладать определёнными свойствами:
1) k1 = 1;
2) kt > kt-1 для всех t;
3) kt не должны быть кратными друг другу (это для того, чтобы не повторялась обработка ранее отсортированных элементов).
Дональд кнут предложил две последовательности расстояний:
1, 4, 13, 40, 121, …, т.е. Kt = 1+3*kt-1;
1, 3, 7, 15, 31, …, т.е. Kt = 1+2*kt-1 = 2t - 1.
Первая последовательность расстояний подходит для сортировок достаточно длинных массивов, а вторая подходит для коротких массивов.
Пример расчёта последовательности расстояний для малых массивов
Для удачного подбора значений необходимо, чтобы длина массива n попадала в такие границы
Kt <= n -1 < kt+1 или 2t <= n < 2t+1. (14.1).
Если прологарифмировать (14.1) по основанию 2, то можно получить следующее уравнение:
T <= log n < t+1. (14.2).
Далее из (14.2) получаем:
T = trunc(log n). (14.3).
Если используется язык программирования, в котором можно логарифмировать только по основанию е (натуральный логарифм), то необходимо применить знакомое из курса средней школы правило «превращения» логарифмов: logmx =logzx/logzm, где в нашем случае m = 2, z = e. Тогда выражение (14.3) будет иметь вид:
T= trunc(ln(n)/ln(2)). (14.4)
Если посчитать t по формулам (12.3), (12.4), то часть подпоследовательностей будет иметь длину 2, а часть – и вовсе 1. Сортировать такие подпоследовательности незачем, поэтому стоит сразу же отступить еще на 1 шаг. Тогда, можно записать окончательное выражение для числа шагов:
T= trunc(ln(n)/ln(2))-1. (14.5)
Тогда расстояние между элементами, т.е. Шаг, в любой подпоследовательности вычисляем таким образом:
K= 2t-1 или k= (1 shl t)-1. (14.6)
Количество подпоследовательностей, которые необходимо будет отсортировать прямой вставкой, для рассматриваемого шага будет равна k.
Далее необходимо определить, сколько элементов будет входить в каждую подпоследовательность. Если длину всей сортируемой последовательности n можно разделить на шаг k без остатка, тогда все подпоследовательности будут иметь одинаковую длину, а именно
S = n div k. (14.7)
Если же n не делится на шаг k нацело, то первые р подпоследовательностей будут длиннее на единицу. Количество таких подпоследовательностей равно остатку от деления n на шаг k:
P = n mod k. (14.8)