Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОМП. НАУКИ_1сем.doc
Скачиваний:
6
Добавлен:
05.11.2018
Размер:
902.14 Кб
Скачать
    1. Примеры рекурсивных программ

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

Program Reverse;

procedure Rev;

var n: integer;

begin

readln(n); {ввод чисел на рекурсивном спуске}

if n<>0 then Rev; {условный рекурсивный вызов}

writeln(n) {вывод чисел на рекурсивном возврате}

end;

begin Rev end.

Допустим, ввели последовательность: 5 7 2 0

Вывод после завершения ввода будет в обратном порядке: 2 7 5

      1. Поиск максимального элемента массива

Суть рекурсивного поиска максимума – длина части массива, на которой ведется поиск, на каждом шаге рекурсивного спуска уменьшается на 1. Когда эта длина станет равной 1, принимаем за максимальный этот единственный рассматриваемый на данном шаге рекурсии элемент.

Больше рекурсивных вызовов не происходит, начинается завершение работы вызванных функций, т.е. рекурсивный возврат. На каждом шаге рекурсивного возврата к уже обработанной части массива добавляется один элемент. Если этот элемент A[L] больше найденного ранее максимума, то значение A[L] принимается за новое значение максимума.

program Max_vector;

const N=10;

type vector=array[1..N] of integer;

var V:vector;

function RMax(const A:vector; L:integer):integer;

{Рекурсивная функция поиска максимального элемента в массиве A, который передается как константа.

L – длина части массива, рассматриваемой на каждом шаге рекурсии.}

var M: integer;

begin

if L=1 then RMax:=A[1] {Считаем A[1] максимальным; рекурсивный спуск закончен}

else begin

M:=RMax(A, L-1); {Уменьшение длины части массива на 1 на рекурсивном спуске}

if A[L]>M then RMax:=A[L] {Сравнение на рекурсивном возврате}

end

end;

begin

{Ввод элементов массива V} … ;

writeln('Максимум, найденный рекурсивно: ', RMax(V, N));

end.

      1. Быстрая сортировка – усовершенствованный метод сортировки обменом

Алгоритм быстрой сортировки, который разработал английский информатик Чарльз Хоор (C. Hoare) в 1960 г., является наиболее популярным алгоритмом сортировки.

Анализ эффективности быстрой сортировки

В среднем число операций порядка Nlog2N, остальные сортировки в среднем N2 операций.

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

Принцип быстрой сортировки

Причина неэффективности метода сортировки обменом (метод «пузырька») в том, что меняются местами два соседних элемента, если для них нарушена упорядоченность. Менять местами надо максимально удаленные элементы.

Алгоритм одного шага быстрой сортировки

  1. Положить i=1, j=N

  2. Выберать в массиве случайным образом элемент x.

  3. Повторять

Просматривая массив слева направо, найти элемент Ai > x.

Просматривая массив справа налево, найти элемент Aj < x.

Если i<=j, то поменять местами Ai и Aj, увеличить i+1, уменьшить j-1

  1. Конец повторения

Чтобы отсортировать массив полностью, надо то же самое сделать с обеими частями (слева и справа от x), затем с частями этих частей и т.д. до тех пор, пока каждая часть не будет содержать только один элемент. Получили рекурсивный алгоритм.

Пример одного шага быстрой сортировки (см. рисунок).

program QuickSort; //Быстрая сортировка. В качестве x в каждом подмассиве выбирается средний элемент

Const N=100;

var A: array[1..N] of integer;

i: integer;

procedure QSort(L,R:integer); //L, R – индекс самого левого и самого правого элементов подмассива

var i,j,x,w:integer;

begin

i:=L; j:=R;

x:=A[(L+R) div 2]; //x - средний элемент

repeat

while A[i]<x do i:=i+1; //Просмотр слева направо

while A[j]<x do j:=j-1; //Просмотр справа налево

if i<=j then

begin //Перестановка A[i] и A[j]

w:=A[i];

A[i]:=A[j];

A[j]:=w;

i:=i+1; j:=j-1

end

until i>j;

if L<j then QSort(L,j); //Рекурсивный вызов для левой половины массива

if i < R then QSort(i,R) //Рекурсивный вызов для правой половины массива

end; {конец процедуры QSort}

begin

… {Ввод значений в массив A}

Sort(1,N);

… {Вывод отсортированного массива}

end.