- •Введение
- •1. Алгоритмы сортировки
- •1.1. Общие положения
- •1.2. Сортировка простыми включениями
- •Словесное описание алгоритма
- •1.3. Сортировка простым выбором
- •1.4. Сортировка простым обменом
- •1.5. Задания для самостоятельной работы
- •2. Алгоритмы покрытия
- •2.1. Постановка задачи покрытия
- •2. 2. Алгоритм полного перебора
- •2. 3. Алгоритм граничного перебора по вогнутому множеству
- •2.4. Алгоритмы, использующие сокращение таблицы покрытий
- •1. Для случая построения одного кратчайшего покрытия
- •2. В случае построения минимального покрытия
- •3. При условии построения всех безызбыточных покрытий
- •2.5. Алгоритм приближенного решения задачи о покрытии
- •2.6. Задачи для самостоятельной работы
- •3. Алгоритмы на графах
- •3.1. Общие положения
- •3.2. Алгоритмы нахождения оптимального пути
- •Волновой алгоритм построения кратчайшего пути для взвешенного графа
- •Волновой алгоритм построения длиннейшего пути во взвешенном графе
- •3.3. Нахождение компонент связности
- •Алгоритм построения компонент связности в неориентированном графе
- •Пример 3.5
- •3.4. Алгоритмы нахождения подграфов
- •3.5. Дерево. Остов
- •Пример 3.7.
- •Алгоритм построения произвольного остова
- •Алгоритм построения минимального остова
- •Алгоритм построения системы независимых циклов графа
- •Пример 3.12.
- •3.6. Алгоритм кратчайшей раскраски графа
- •3.7. Задачи для самостоятельной работы
- •4. Конечные автоматы
- •4.1. Общие положения
- •4.2. Представление автомата
- •4.3. Взаимные преобразования автоматов
- •4.4. Определение реакции автомата на входное слово
- •4.5. Задания для самостоятельной работы
- •5. Машины тьюринга
- •5.1. Общие положения
- •5.2. Операции над машинами Тьюринга
- •6. Структуры данных
- •6.1. Списки
- •6.2. Двусвязный список
- •6.3. Кольцевой список
- •6.4. Стек
- •6.5. Очередь
- •6.6. Задания для самостоятельной работы
- •Литература
1.2. Сортировка простыми включениями
Этот метод обычно заключается в следующем. Элементы условно разделяются на готовую подпоследовательность a1,…,ai-1 и входную подпоследовательность ai,…,an. На каждом шаге, начиная с i=2 и увеличивая i на единицу, берут i-й элемент входной подпоследовательности и передают в готовую последовательность, вставляя его на подходящее место. При поиске подходящего места удобно чередовать сравнения и пересылки, т.е. как бы "просеивать" x, сравнивая его с очередным элементом aj и либо вставляя x, либо пересылая aj направо и продвигаясь налево. Заметим, что "просеивание" может закончиться при двух различных условиях:
1. Найден элемент aj с ключом меньшим, чем ключ x.
2. Достигнут левый конец готовой подпоследовательности.
Этот типичный пример цикла с двумя условиями окончания даёт нам возможность рассмотреть хорошо известный прием фиктивного элемента ("барьера"). Его можно легко применить в этом случае, установив барьер a0 = x (заметим, что для этого нужно расширить диапазон индексов в описании а до 0, ..., n.)
Процесс сортировки простыми включениями показан в таблице 1.1 на примере восьми случайно взятых чисел (вертикальной чертой отделяются элементы готовой входной подпоследовательности).
Словесное описание алгоритма
0. В готовую подпоследовательность записывается a1, во вход-ную a2,…, an.
1. i :=2.
2. Переносим элемент x=ai из входной подпоследовательности в готовую так, чтобы готовая подпоследовательность осталась отсортированной. Для этого:
а) расширяем готовую подпоследовательность слева с помощью барьера a0 = x.
б) параметр цикла поиска подходящего места принимает значение j:=i-1;
в) пока x<aj, выполняется сдвиг элемента aj вправо (aj+1:=aj) и уменьшение j на единицу (j:=j-1);
г) aj+1:=x.
3. i:=i+1. Если i≤n, то переходим на п. 2, иначе сортировка закончена.
Алгоритм сортировки простыми включениями легко можно улучшить, пользуясь тем, что готовая подпоследовательность a1,…, ai+1, в которую нужно включить новый элемент, уже упорядочена. Поэтому место включения можно найти значительно быстрее. Очевидно, что здесь можно применить бинарный поиск, который исследует средний элемент готовой подпоследовательности и продолжает деление пополам, пока не будет найдено место включения. Модифицированный алгоритм сортировки называется сортировкой бинарными включениями.
Таблица 1.1
Словесное описание алгоритма
0. В готовую подпоследовательность записывается a1, во входную – a2,…,an .
1. i:=2.
2. Переносим элемент х=ai из входной подпоследовательности в готовую так, чтобы последняя осталась подсортированной. Для этого:
а) организуем бинарный поиск места включения х в готовую подпоследовательность: находим срединный элемент готовой подпоследовательности - am, где m = ]i/2[, и сравнивая его с х. Если amх, то ведём далее поиск в левой половине готовой подпоследовательности, т.е. опять находим срединный элемент и сравниваем его с х, и т.д. пока не найдём номер j такой, что aj≤x<aj+1; иначе аналогично ведём поиск в правой половине готовой подпоследовательности;
б) если j=i-1, то переходим к п. в), иначе расширяем готовую подпоследовательность справа, сдвигая её элементы, начиная с aj+1, вправо.
в) aj+1:=x.
3. i:=i+1. Если i≤n, то переходим на п. 2, иначе сортировка закончена.