Сортировка слиянием: не могу разобраться как работает рекурсия!
вот сама программа, на всякий случай:
Код:
program Sortirovka_Sliyaniem;
{$APPTYPE CONSOLE}
uses SysUtils;
Type t_type = integer;
t_array = array [1..20] of t_type;
Procedure Merge(var A: t_array; p,q,r,g:t_type);
var n1,n2,i,j,k:integer;
Left: t_array;
Right: t_array;
begin
n1:=q-p+1;
n2:=r-q;
for i:=1 to n1 do Left[i]:=A[p+i-1];
for j:=1 to n2 do Right[j]:=A[q+j];
Left[n1+1]:=high(integer);
Right[n2+1]:=high(integer);
i:=1;
j:=1;
for k:=p to r do
if Left[i]<=Right[j] then begin
A[k]:=Left[i];
inc(i);
end
else begin
A[k]:=Right[j];
inc(j);
end;
for j:=1 to g do write(A[j]);
write(' ! ',n1,' ',n2);
writeln;
end;
Procedure Merge_Sort(var A: t_array; p,r,g: t_type);
var q,j: t_type;
begin
if p<r then begin
q:=(p+r) div 2;
Merge_Sort(A,p,q,g);
Merge_Sort(A,q+1,r,g);
Merge(A,p,q,r,g); //writeln(q);
//writeln;
//write(q);
//writeln;
//for j:=1 to g do write(A[j],' ');
writeln;
end;
end;
var A: t_array;
i,j,n: t_type;
begin
//reset(input, 'input.txt');
//rewrite(output, 'output.txt');
read(n);
randomize;
for i:=1 to n do read(a[i]);//A[i]:=(random(50));
for j:=1 to n do write(A[j],' ');
writeln;
writeln;
{i:=0;
while not seekeof do begin
inc(i);
read(A[i]);
end;}
//Merge(A,1,6,i);
Merge_Sort(A,1,n,n);
writeln;
for j:=1 to n do write(A[j],' ');
readln;
readln;
end.
Вот часть кода, где я не понимаю:
Код:
Procedure Merge_Sort(var A: t_array; p,r,g: t_type);
var q,j: t_type;
begin
if p<r then begin
q:=(p+r) div 2;
Merge_Sort(A,p,q,g);
Merge_Sort(A,q+1,r,g);
Merge(A,p,q,r,g); //writeln(q);
//writeln;
//write(q);
//writeln;
//for j:=1 to g do write(A[j],' ');
writeln;
end;
end;
Я вообще в принципе не знаю как работает рекурсивный вызов в delphi. Буду благодарен за любые ссылки, где описываются правила работы рекурсивных функций в delphi, сам я не нашёл.
|