
- •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
- •Естественное двухпутевое слияние
- •Рекурсивный алгоритм слияния
Сортировка Радикс Обменом
procedureRadixExchange(l,r,b :integer
);
vart,i,j :integer;
begin
if(r >
l)and(b >= 0)then begin
i :=l;j :=r;
repeat
while(bits(a[i],b, 1) = 0)and(i < j )doInc(i);
while(Bits(a[i],b, 1) = 1)and(i < j )doDec(j);
t :=a[i];a[i] :=a[j];a[j]
:=t;
untilj=i;
ifBits(a[r],b, 1)= 0 thenInc(j);
RadixExchange(l,j-1,b-1);
RadixExchange(j,r,b-1);
end;
end;
Сортировка файла по определенному биту очень схожа с процедурой деления в алгоритме быстрой сортировки: найдем 1 слева, 0 справа, обменяем, и повторяем до тех пор, пока указатели сканирования не пересекутся. Это приводит к процедуре сортировки, очень схожей с быстрой сортировкой:
Обращение типа: RadixExchange(1, N, 32) отсортирует файл из N элементов c32-битными ключами.
Прямая Радикс Сортировка
Другой способ – исследовать биты справа налево (сначала младшие, затем старшие биты). Этот метод использовался старыми машинами для сортировки перфокарт: колода карт проходила сквозь машину 80 раз, по разу для каждой колонки, справа налево.
Для того чтобы такая сортировка работала, необходимо, чтобы метод, сортирующий массив по части ключа был стабильным.
Если
в качестве единицы радикс сортировки
взять один бит, то напрашивается метод
сортировки подсчетом распределения,
который считает, что сортируемый массив
содержит только два значения – 0 и 1. На
самом же деле, нет никакой необходимости
в том, чтобы Mp
(количество различных возможных
значений) было равно 2, более того, лучше
братьнастолько большое, насколько это
возможно. Таким образом, прямая радикс
сортировка становится улучшенной
сортировкой подсчетом распределения
дляwправых бит:
procedure StrightRadix;var i, pass : integer; count : array [0..Mp] of integer; begin for pass := 0to (w div m)-1do begin for i := 0to Mp-1do count[i]:=0; for i := 1to N do Inc( count[ Bits( a[i], pass*m, m) ] ); for i := 1to Mp-1do Inc( count[i], count[i-1] ); for i := N downto 1do begin b[ count[ Bits( a[i], pass*m, m ) ] ] := a[i]; Dec( count[ Bits( a[i], pass*m, m) ] ); end; a := b; end; end;
Свойства Радикс Сортировок
Свойство 1. Сортировка радикс-обменом
использует в среднем около
битовых
сравнений.
Свойство 2. Обе радикс сортировки используют менее чем Nb сравнений для сортировки N b-битовых ключей.
Свойство 3. Прямая радикс-сортировка
может сортировать N записей с
b-битовыми
ключами в b/m проходов используя
дополнительных счетчиков, и буфер для
реорганизации файла.
Если количество доступной памяти стремится к бесконечности, то прямая радикс-сортировка превращается в сортировку подсчетом распределения.
31. Рекурсия Рекурсивные определения
Возможно, многие попадали в такую ситуацию, когда, чтобы максимально строго определить некоторое понятие, приходилось строить определение понятия, опираясь на само это понятие. Часто такие «зацикленные определения» скорее запутывают, чем помогают. Тем не менее, существует допустимая математическая форма определений, при построении которой определяемое понятие используется и как заголовок конструкции, и как ее элемент. Эта форма определений называется рекурсивной или индуктивной.
Все рекурсивные определения состоят из двух независимых частей. Эти части принято называть базовой (или базисной) и рекурсивной (или индуктивной) частями. Базовая часть является нерекурсивным утверждением; она задает определение для некоторой фиксированной группы объектов. Рекурсивная часть определения записывается так, чтобы при цепочке повторных применений она редуцировалась бы к базе.
Рассмотрим пример.
Определение понятия нечетное целое число:
База:
Число «один» является нечетным целым числом.
Рекурсия:
Если I является нечетным целым числом, то нечетными числами являются числа, определяемые выражениями I+2 и I-2.
В дополнение к базовой и рекурсивной частям существует еще одна неявная часть для каждого рекурсивного определения. База устанавливает один или более случаев, которые удовлетворяют определению. Рекурсивная часть показывает, как надо применять определение, чтобы проверить, удовлетворяют ли ему другие случаи. Неявная часть (по умолчанию) утверждает, что «нет иных альтернатив, удовлетворяющих определению».
Рекурсивные определения образуют важное для программирования средство. Они могут быть использованы как при определении структур данных, так и алгоритмов. Иногда рекурсивные определения не только удобны, но и неизбежны. Попробуйте определить множество чисел Фибоначчи, не прибегая к рекурсии! Рекурсивное определение выглядит следующим образом:
Определение понятия «числа Фибоначчи»:
База:
Первое число Фибоначчи равно 1.
Второе число Фибоначчи также равно 1.
Рекурсия:
Каждое из чисел Фибоначчи, кроме двух первых, получается в результате суммирования двух предыдущих чисел Фибоначчи в образующейся последовательности.