- •1.Основные понятия эис
- •19. Классификация алгоритмов
- •Классификация Алгоритмов
- •20. Абстрактные типы данных (массивы, связанные списки, выделение памяти)
- •Абстрактные типы данных
- •Элементарные Структуры Данных
- •Массивы
- •Связанные списки
- •Выделение Памяти
- •21. Стеки, очереди, деревья
- •Очереди
- •Деревья
- •Терминология
- •22. Математические характеристики деревьев
- •Свойства
- •23. Обход деревьев
- •Обход Деревьев
- •Алгоритм быстрой сортировки
- •1 2 3 4 5 6 7
- •25. Критерии эффективности алгоритмов (формирование, поиск последовательного масиива)
- •26. Критерии эффективности алгоритма ступенчетого поиска
- •27. Сортировка методом Шелла Сортировка Шелла
- •28. Сортировка простым включением
- •29. Приоритетные очереди
- •30. Радикс сортировка Радикс Сортировка
- •Сортировка Радикс Обменом
- •Прямая Радикс Сортировка
- •Свойства Радикс Сортировок
- •31. Рекурсия Рекурсивные определения
- •Рекурсивные процедуры
- •Итерация и рекурсия
- •32. Рекурсивный обход деревьев, удаление рекурсии Рекурсивный Обход Дерева
- •Удаление Рекурсии
- •33. Элементарные методы сортировки и их характеристики Элементарные Методы Сортировки
- •Правила Игры
- •Сортировка Выбором
- •Сортировка Вставкой
- •34. Простейшие алгоритмы сортировки (методом пузырька, сортировка выбором, шейкер сортировка, ростировка Шелла), сравнение простых методов сортировки. Пузырьковая Сортировка
- •Характеристики Простейших Сортировок
- •Сортировка Файлов с Большими Записями
- •Сортировка Шелла
- •Подсчет Распределения
- •35. Алгоритмы быстрой сортировки, разрядная сортировка Алгоритм быстрой сортировки
- •1 2 3 4 5 6 7
- •36. Пирамидальная сортировка Пирамидальная сортировка
- •37. Сортировка слиянием (простое слияние, двухпутевое слияние, рекурсивный алгоритм слияния) Сортировка слиянием
- •Простое слияние
- •Y 1 2 3 4 5 6 7 8
- •Естественное двухпутевое слияние
- •Рекурсивный алгоритм слияния
Рекурсивный алгоритм слияния
Алгоритм разбивает массив на две части, рекурсивно сортирует каждую половину, а затем сливает их в один отсортированный массив. Для хранения отсортированных половин используется вспомогательный массив y. Чтобы не использовать «сторожевых» элементов можно применить следующий прием: первую половину копировать в прямом порядке, а вторую – в обратном, тогда каждый из подмассивов служит сторожем для другого –y[m+1] – максимум для всей правой части и сторож для левой части,y[m]- максимум для левой части и сторож для правой.
Procedure Merge(var x: vector; l, r: integer);
Var i, j, k, m: integer;
Y: vector;
Begin
If r-l>0 then
Begin
m:=(r+l) div 2;
Merge(x, l, m;)
Merge(x, m+1, r);
For i:=m downto l do y[i]:=x[i];
For j:=m+1 to r do y[r+m+1-j]:=x[j];
For k:=l to r do
If y[i]<y[j] then begin x[k]:=y[i]; inc(i) end
Else begin x[k]:=y[j]; dec(j) end
End
End;
Слияние списков
Основным недостатком алгоритмов слияния является использование дополнительной памяти размером в Nэлементов. В действительности, если добавить связи между исходными элементами, то все слияние можно легко произвести, манипулируя связями. ДобавлениеNполей связи, как правило, выгоднее, чем хранениеNдополнительных элементов. Кроме того, манипулируя связями, мы отказываемся от «дорогой» операции перемещения записей и экономим время сортировки. Поэтому рассмотрим алгоритм слияния на связанных списках.
Procedure merge (L1, L2: Link; var L: Link);
Var p: link;
Begin
P:=z;
Repeat
if L1^.elem<=L2^.elem
then begin P^.next:=L1; P:=L1; L1:=L1^.next end
else begin P^.next:=L2; P:=L2; L2:=L2^.next end;
until P^.elem=Maxint;
L:=Z^.next; z^.next:=z
End;
В программе списки L1,L2 имеют общий конечный узел («хвост»)z, который указывает сам на себя. «Хвост» выполняет несколько полезных функций:
Z^.elemсодержит граничный сторожевой элемент,
Z^.nextпри слиянии используется в качестве указателя на начало объединенного списка,
после слияния Z^.nextснова устанавливается на себя.
Сравнение на равенство ключей (<=) делает сортировку устойчивой. Например, списки на рисунке в случае устойчивой сортировки дают в результате 1A, 2B, 2C, 2E, 2F, 3D, 4G.
1 L1 |
A |
|
|
2 |
B |
|
|
2 |
C |
|
|
3 |
D |
|
|
|
|
|
2 L2 |
E |
|
|
2 |
F |
|
|
4 |
G |
|
|
|
|
|
А в случае неустойчивой сортировки
1A, 2E, 2G, 2B, 2C, 3D, 4G.
В случае внутреннего слияния связанное распределение памяти имеет явные преимущества перед последовательным распределением: требуется меньше памяти и программа работает на 10-20% быстрее.
38. сбалансированное многопутевое слияние
1Решето Эратосфена и проблема Джозефа будут рассмотрены позднее.
2Для клерка кучка должна стать достаточно маленькой для сортировки вручную