- •Основные понятия структур
- •Концепция типа данных, простейшие типы данных, стандартные типы данных, органические типы (диапазоны)
- •Статические и полустатические структуры данных
- •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. Алгоритм Боуера и Мура
- •Сортировка. Необходимые определения и классификация сортировок. Сортировки прямого включения и выбора. Их эффективность Необходимые определения и классификация сортировок.
- •Сортировка методом прямого включения
- •Эффективность алгоритма сортировки прямого включения
- •Сортировка методом прямого выбора
- •Эффективность алгоритма сортировки прямого выбора
- •Сортировка прямого обмена. Её эффективность
- •Эффективность алгоритма сортировки прямого обмена
- •Улучшенные методы сортировки. Быстрая сортировка. Её эффективность.
- •Быстрая сортировка
- •Принцип работы быстрой сортировки
- •Пример работы быстрой сортировки
- •Блок-схема быстрой сортировки
- •Улучшенные методы сортировки. Сортировка шелла. Её эффективность. Сортировка шелла
- •Принцип работы сортировки шелла и необходимые расчёты для её реализации
- •Пример расчёта последовательности расстояний для малых массивов
- •Пример работы сортировки шелла
- •Принцип работы пирамидальной сортировки
- •Пример работы пирамидальной сортировки
- •Представление графов
- •Нахождение кратчайших путей между парами вершин
Принцип работы пирамидальной сортировки
Сначала производится просеивание – это первая часть алгоритма, а затем осуществляется основная сортировка – это вторая часть алгоритма.
Первая часть алгоритма. Первая часть алгоритма – просеивание, необходима для преобразования исходного массива в пирамиду, в которой каждый верхний элемент «опирается» на два меньших элемента. Эту часть назвали просеиванием, так как данная операция напоминает процесс разделения смеси на фракции в соответствии с их размерами, где сначала задерживаются большие частицы, а потом всё более мелкие.
Из рисунка 15.1 видно, что любой элемент a[i], где 1<=i<=n div 2, «опирается» на элементы a[2*i] и a[2*i+1]. Таким образом формируются тройки из элементов. Такой тройкой являются элементы a[6], a[12] и a[13].
Для просеянной пирамиды необходимо, чтобы выполнялось следующее условие – в каждой тройке максимальный элемент должен находиться «сверху», т.е. A[6] должен быть больше a[12] и a[13]. Исходный массив сначала может и не удовлетворять этому свойству, поэтому его немного перестраивают, т.е. Просеивают в соответствии с приведённым условием. В процессе просеивания изменяется последовательность элементов в массиве.
Начинается просеивание «снизу». Половина элементов с ((n div 2)+1)-го элемента по n-й элемент являются основанием пирамиды, их просеивать не нужно. Но для всех остальных элементов, продвигаясь от конца массива к его началу, проверяются тройки элементов a[i], a[2*i] и a[2*i+1], в которых перемещают максимальный элемент «наверх», т.е. В элемент a[i]. Если в результате такого одного прохода снизу вверх была нарушена пирамидальность в других ниже лежащих тройках элементов, то необходимо снова произвести просеивание, но уже сверху вниз к её основанию.
Вторая часть алгоритма. Для n-1 элементов, начиная с последнего, нужно осуществить следующие действия. Сначала нужно поменять местами очередной «рабочий» элемент с первым. Потом просеивается новый первый элемент сверху вниз так, чтобы не затрагивалось уже отсортированное основание, т.е. Элементы с i-го по n-й.
Первым рабочим элементом является n, а потом n-1, затем n-2 и т.д.
Во второй части алгоритма должно быть осуществлено n-1 перестановок. При первой перестановке самый верхний элемент становится последним элементом и становится первым элементом уже отсортированного основания. После второй перестановки другой верхний элемент перемещается на место предпоследнего элемента массива и так же входит в уже отсортированное основание. Процесс повторяется до тех пор пока в не отсортированной части не останется один самый маленький элемент. Такой способ просеивания помогает вытолкнуть на вершину пирамиды самый большой элемент, а потом его переместить в начало отсортированной последовательности, т.е. В её уже отсортированное основание.
Пример работы пирамидальной сортировки
Необходимо отсортировать массив 13, 0, 29, 56, 7, 15, 78. В дальнейшем на рисунках в этой лекции основание пирамиды – это цифры выделенные курсивом и жирным шрифтом, а уже отсортированная последовательность – цифры с подчёркиванием и жирным шрифтом. Элементы, которые меняются местами, выделяются серым тоном.
Получим просеянную начальную пирамиду (рис. 15.2), т.е. Осуществим первую часть алгоритма:
Далее вторая часть (рис. 15.3), где выполняются n-1=7-1=6 перемещений рабочего элемента в вершину с последующим просеиванием:
Блок-схема пирамидальной сортировки
На рисунке 15.5 приведена блок-схема алгоритма пирамидальной сортировки, а на рис. 15.6 приведена блок-схема алгоритма процедуры proseit_one_element, которая просеивает один элемент. Переменная b – это локальная переменная процедуры proseit_one_element, которой присваиваются при вызове данной процедуры значения сначала n, а потом i-1.
Эффективность алгоритма пирамидальной сортировки
Данная сортировка очень эффективно сортирует массивы большого размера и имеет сложность пропорциональную n*logn.
Ориентированные и неориентированные графы. Алгоритмы на графах
Что такое «графы»
Если требуется наглядно представить отношения между какими-либо объектами, то для этого используется естественная модель таких отношений – ориентированные и неориентированные графы.
Ориентированный граф. Эта структура так же называется орграф. Она состоит из множества вершин v и множества дуг e. Орграф через вершины и дуги определяют так g=(v, e).
Узлами называют вершины орграфа, а ориентированными ребрами – его дуги. Дугу можно представить в виде упорядоченной пары вершин (рис. 16.1), где v - начало, а w - конец дуги. Дугу записывают как vw или (v, w), а произносится это так: дуга ведёт от вершины v к вершине w или вершина w смежная с вершиной v.
Путь по орграфу от точки v1 до точки vn – это последовательность вершин v1, v2, ..., vn, для которой существуют дуги v1v2, v2v3, ...,vn-1vn. В этом случае длина пути будет равна n-1.
Если к вершинам или к дугам орграфа присоединены метки, то это помеченный орграф. Метка – это имя, вес (стоимость дуги), или значение какого-либо заданного типа
Неориентированный граф. Данная структура так же называется граф. Все выше приведённые определения для орграфа так же применимы и для графа с учётом некоторых особенностей. Граф в отличии от орграфа состоит из рёбер (v, w), которые соединяют неориентированные пары вершин (рис. 16.2). Такой граф обладает свойством (v, w)=(w, v), т.е. Значение метки для ребра не зависит от направления.
Чтобы можно было работать с графом, необходимо представить его в соответствующем виде, т.е. Придумать такую структуру, которая позволила бы составлять для графа алгоритмы и производить расчёты с использованием вычислительной машины.