- •2. Основные операции для работы с d-кучами
- •3. Лабораторные работы
- •3.1. Нахождение кратчайших путей в графе Постановка задачи
- •Структура данных для представления графа
- •Алгоритм Дейкстры, реализованный на основе d-кучи
- •Алгоритм Дейкстры, использующий метки
- •Алгоритм Форда–Беллмана
- •Задания для лабораторной работы № 1
- •3.2. Нахождение минимального остова графа Постановка задачи
- •Стратегии решения задачи
- •Алгоритм Борувки
- •Алгоритм Краскала
- •Алгоритм Прима
- •Round Robin алгоритм
- •Задания для лабораторной работы № 2
- •3.3. Создание и использование словаря Постановка задачи
- •Решение задачи создания и использования словаря
- •Тривиальный алгоритм
- •Алгоритм с использованием авл-дерева
- •Задания для лабораторной работы № 3
- •3.4. Поиск фрагмента в тексте Постановка задачи
- •Наивный алгоритм поиска фрагмента в тексте
- •Алгоритм Кнута-Морриса-Пратта
- •Задания для лабораторной работы № 4
- •3.5. Сортировка Постановка задачи
- •Сортировка с помощью d-кучи
- •Быстрая сортировка
- •Задания для лабораторной работы № 5
- •3.6. Построение выпуклой оболочки n точек на плоскости Постановка задачи
- •Построение выпуклой оболочки с помощью сортировки
- •Задания для лабораторной работы № 6
- •3.7. Поиск пары пересекающихся отрезков Постановка задачи
- •Наивный алгоритм поиска пересечения
- •Эффективный алгоритм поиска пересечения
- •Задания для лабораторной работы № 7
- •4. Приложение: генерация графов для экспериментов
- •Литература
3.5. Сортировка Постановка задачи
Упорядочить массив a[1..n] по неубыванию в соответствии с линейным порядком (), заданным на элементах данного массива, путем перестановки его элементов. (Отношение строгого порядка (<), как обычно, определяется следующим образом: b<c, если bc и b ≠ c.)
Сортировка с помощью d-кучи
Реализация алгоритма сортировки с помощью d-кучи (см. [1], [5]) массива a длины n осуществляется процедурой SORT_D(a, n). При этом к моменту выполнения последнего for-цикла массив a был упорядочен по невозрастанию, а после его исполнения упорядочивается по неубыванию.
В данной задаче массивом ключей d-кучи является массив a, массив имен и сами имена элементов не используются, поэтому из псевдокодов всех операций с d-кучей следует выбросить все части кода для работы с именами элементов и массивом имен.
procedure SORT_D(var a; n,d);
begin
ОБРАЗОВАTЬ_ОЧЕРЕДЬ(a,n,d);
nq:= n; while nq>1 do ИЗЪЯТИЕ_МИНИМУМА (a1, a, n, d);
for i := 1 to (n mod 2) do a[i]a[n-i+1];
end;
Временная сложность сортировки с помощью d–кучи, где d2, есть O(nlog n).
Быстрая сортировка
Быстрая сортировка (см. [1]) относится к типу алгоритмов “разделяй и властвуй”. Данный алгоритм, сортирующий массив a[1..n] по неубыванию, представлен процедурой SORT_QUICK(a, 1, n). Операция РАЗДЕЛЯЙ(a, i, j, i1) путем перестановки элементов массива a изменяет его так, чтобы a[i], …, a[i1-1] ≤ a[i1] ≤ a[i1+1], …, a[j], и одновременно определяет число i1.
procedure SORT_QUICK (var a, i, j);
begin
if i < j then begin
РАЗДЕЛЯЙ (a, i, j, i1);
SORT_QUICK (a, i, i1-1); SORT_QUICK (a, i1+1, j);
end;
end;
procedure РАЗДЕЛЯЙ (var a, i, j, var i1);
begin
k:= (i+j)mod(2); b:= a[k];
i1:= i; j1:= j;
repeat
while a[j1] < b & j1 > i do j1:= j1-1;
while a[i1] > b & i1 <j do i1:= i1+1;
if i1 <= j1 then begin
a[i1]a[j1]; i1:= i1+1; j1:= j1-1;
end;
until i1 > j1;
end;
Временная сложность быстрой сортировки n элементного массива оценивается сверху величиной O(n2), однако, в среднем быстрая сортировка выполняется за время O(nlog n).
Задания для лабораторной работы № 5
Предлагается попарное сравнение различных алгоритмов сортировки массива, состоящего из натуральных чисел.
Варианты выбора пары алгоритмов A и B для сравнения:
Вариант d=2, …, 101
А сортировка d-кучей,
В сортировка (d+1)-кучей;
Вариант d=102, …., 200
А сортировка (d-100)-кучей,
В быстрая сортировка.
Задание.
Написать программу, реализующую алгоритм А и алгоритм В.
Написать программу, реализующую алгоритм А и алгоритм В, для проведения экспериментов, в которых можно выбирать:
количество n элементов в исходном массиве a,
верхнюю q и нижнюю w границы для значений элементов массива,
заполнение массива a:
псевдослучайное,
автоматическое по неубыванию,
автоматическое по невозрастанию.
Выходом данной программы должно быть время работы ТА алгоритма А и время работы ТВ алгоритма В в секундах.
Провести эксперименты на основе следующих данных:
q = 1, w = 109, n = 1, … ,106+1 с шагом 104, заполнение массива a:
псевдослучайное,
по возрастанию,
по убыванию
(нарисовать графики функций TА(n) и ТВ(n) для всех трех случаев).
q = 1, w = 1, … ,100 с шагом 1, n = 106, заполнение массива a:
псевдослучайное,
по возрастанию,
по убыванию.
(нарисовать графики функций TА(w) и ТВ(w) для всех трех случаев),
Сформулировать и обосновать вывод о том, в каких случаях целесообразно применять алгоритм А, а в каких алгоритм В.