Сортировка слиянием: не могу разобраться как работает рекурсия!
вот сама программа, на всякий случай:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | 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 ;
end ;
end ;
var A: t_array;
i,j,n: t_type;
begin
read(n);
randomize;
for i:= 1 to n do read(a[i]);
for j:= 1 to n do write (A[j], ' ' );
writeln ;
writeln ;
Merge_Sort(A, 1 ,n,n);
writeln ;
for j:= 1 to n do write (A[j], ' ' );
readln;
readln;
end .
|
Вот часть кода, где я не понимаю:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 ;
end ;
end ;
|
Я вообще в принципе не знаю как работает рекурсивный вызов в delphi. Буду благодарен за любые ссылки, где описываются правила работы рекурсивных функций в delphi, сам я не нашёл.
|