Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты на зачет.docx
Скачиваний:
55
Добавлен:
01.06.2015
Размер:
554.66 Кб
Скачать

Сортировка Радикс Обменом

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;

Пусть у нас есть способ упорядочить файл по i-му биту так, что сначала идут все ключи в которых этот бит равен 0, а потом все в которых он 1. Это немедленно порождает рекур­сивный сортировочный механизм: отсортировать по старшему биту, потом образовавшиеся два подфайла отсортировать незави­симо друг от друга по следующему биту и т.д.

Сортировка файла по определенному биту очень схожа с процедурой деления в алгоритме быстрой сортировки: найдем 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.

Рекурсия:

Каждое из чисел Фибоначчи, кроме двух первых, получается в результате суммирования двух предыдущих чисел Фибоначчи в образующейся последовательности.