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

2.Сортировка распределением

Мы рассмотрим частный случай сортировки распределением: поразрядную сортировку. Допустим, исходный массив состоит из двухразрядных десятичных чисел

37 24 99 08 22 19 28 82 50 64 11 71 95 76 04 13 81 45 53 17

Заготавливается 10 “карманов” по n элементов каждый и выполняется распределение элементов исходного массива по карманов в зависимости от значения младшего разряда. В нашем случае это распределение будет следующим:

Карманы: 0 1 2 3 4 5 6 7 8 9

50 11 22 13 24 95 76 37 08 99

71 82 53 64 45 17 28 19

81 04

Берем последовательно элементы из карманов и получаем последовательность, упорядоченную по первому разряду:

50 11 71 81 22 82 13 53 24 64 04 95 45 76 37 17 08 28 99 19.

Эту последовательность снова упорядочиваем аналогично предыдущему, но по второму разряду:

Карманы: 0 1 2 3 4 5 6 7 8 9

04 11 22 37 45 50 64 71 81 95

08 13 24 53 76 82 99

17 28

19

Получили упорядоченную последовательность:

04 08 11 13 17 19 22 24 28 37 45 50 53 64 71 76 81 82 95 99.

Если элементы исходной последовательности содержат больше десятичных разряда, то понадобится просто больше шагов распределения.

Примечание. На самом деле нет необходимости заготавливать 10 карманов и распределять физически по ним элементы. Достаточно знать о каждом элементе в какой карман он должен попасть и, по очереди выбирать их из этих виртуальных карманов.

Билет 28

1. Процедуры и функции помещаются в раздел описаний программы. Для обмена информацией между процедурами и функциями и другими блоками программы существует механизм входных и выходных параметров. Входными параметрами называют величины, передающиеся из вызывающего блока в подпрограмму (исходные данные для подпрограммы), а выходными - передающиеся из подрограммы в вызывающий блок (результаты работы подпрограммы).

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

Описание и вызов процедур и функций

Структура описания процедур и функций до некоторой степени похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, перменных. Исполняемая часть содержит собственно операторы процедур.

Формат описания процедуры имеет вид:

procedure имя процедуры (формальные параметры);

раздел описаний процедуры

begin

исполняемая часть процедуры

end;

Формат описания функции:

function имя функции (формальные параметры):тип результата;

раздел описаний функции

begin

исполняемая часть функции

end;

Формальные параметры в заголовке процедур и функций записываются в виде:

var имя праметра: имя типа

и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать (об этом далее). Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.Список формальных параметров может отсутствовать.

Вызов процедуры производится оператором, имеющим следующий формат:

имя процедуры(список фактических параметров);

Список фактических параметров - это их перечисление через запятую. При вызове фактические параметры как бы подставляются вместо формальных, стоящих на тех же местах в заголовке. Таким образом происходит передача входных параметров, затем выполняются операторы исполняемой части процедуры, после чего происходит возврат в вызывающий блок. Передача выходных параметров происходит непосредственно во время работы исполняемой части.

Вызов функции в Турбо Паскаль может производиться аналогичным способом, кроме того имеется возможность осуществить вызов внутри какого-либо выражения. В частности имя функции может стоять в правой части оператора присваивания, в разделе условий оператора if и т.д.

Для передачи в вызывающий блок выходного значения функции в исполняемой части функции перед возвратом в вызывающий блок необходимо поместить следующую команду:

имя функции := результат;

При вызове процедур и функций необходимо соблюдать следущие правила:

количество фактических параметров должно совпадать с количеством формальных;

соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

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

2.Бинарные деревья (основные понятия)

Определение:

Бинарное (двоичное) дерево (binary tree) - это упорядоченное дерево, каждая вершина которого имеет не более двух поддеревьев, причем для каждого узла выполняется правило: в левом поддереве содержатся только ключи, имеющие значения, меньшие, чем значение данного узла, а в правом поддереве содержатся только ключи, имеющие значения, большие, чем значение данного узла.

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

Узел дерева, не имеющий потомков, называется листом.

Схематичное изображение бинарного дерева:

Бинарное дерево может представлять собой пустое множество, и может выродиться в список. Вырожденное бинарное дерево:

Type

Node = ^Bder;

Bder = record

info : char;

left, right : Node;

end;

Var tree : Node;

i, N : Integer;

info : Char;

{Создание нового бинарного дерева}

Procedure NewTree(info : Char; Var tree : Node);

Var P, pr, T : Node;

Begin

New(T);

T^.info := info;

T^.left := Nil;

T^.Right := Nil;

P := tree; Pr := Nil;

While p <> Nil do Begin

Pr := P;

If p^.info > info then P := P^.left

else P := P^.right;

End;

If tree = Nil then tree := T

else

If Pr^.info > info then Pr^.left := T

else Pr^.right := T;

End;

Многие алгоритмы, использующие бинарные деревья, включают два этапа. На первом этапе строится бинарное дерево, а на втором выполняется систематический обход его вершин. Наиболее часто используются следующие способы обхода вершин дерева:

1) Обход в прямом порядке (просмотр в глубину).

2) Обход в обратном порядке.

3) Симметричный обход (обход во внутреннем порядке).

Все три способа описываются рекурсивными алгоритмами.

Бинарное дерево схематически можно представить следующим образом:

T – выделенная вершина – корень, L – левое поддерево, R – правое поддерево.

Тогда для прямого обхода используется алгоритм TLR. Он включает следующие шаги:

1) просмотр корня T

2) просмотр с помощью алгоритма TLR левого поддерева

3) просмотр с помощью алгоритма TLR правого поддерева

Обход в обратном порядке реализуется с помощью алгоритма LRT:

1) обход левого поддерева с помощью алгоритма LRT

2) обход правого поддерева с помощью алгоритма LRT

3) просмотр корня T

Симметричный обход реализуется с помощью алгоритма LTR:

1) просмотр левого поддерева с помощью алгоритма LTR

2) просмотр корня T

3) просмотр правого поддерева с помощью алгоритма LTR

Пример:

Прямой порядок: TLR: 1,2,4,5,8,9,3,6,10,7.

Обратный порядок: LRT: 4,8,9,5,2,10,6,7,3,1.

Симметричный порядок: LTR: 4,2,8,5,9,1,6,10,3,7.

Рассмотрим реализацию этих алгоритмов в программах. Пусть соответствующая процедура обхода вершин некоторого дерева T печатает метки этих вершин. INFO(i,T).

p – указатель на корень дерева

q – указатель на другую вершину

LEFT(i,T) – определение левого потомка вершины i в дереве T.

RIGHT(i,T) – определение правого потомка вершины i в дереве T.

Функции возвращают номер вершины.

INFO(i,T) – возвращает информацию, приписанную вершине i дерева T.

Procedure TLR (p:position);

Var q:position;

Begin

If p<>NIL then

Begin

write(INFO(p,T));

q:=LEFT(p,T); TLR(q);

q:=RIGHT(p,T); TLR(q);

end;

end;

Procedure LRT (p:position);

Var q:position;

Begin

If p<>NIL then

Begin

q:=LEFT(p,T); LRT(q); q:=RIGHT(p,T); LRT(q);

write(INFO(p,T));

end;

end;

Procedure LTR (p:position);

Var q:position;

Begin

If p<>NIL then

Begin

q:=LEFT(p,T); LTR(q); write(INFO(p,T));

q:=RIGHT(p,T); LTR(q); end;

end;

Билет 29

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]