procedure MergeSort (var A: TipoVettore);
procedure MergeVettore (var A: TipoVettore;
iniziale, mediano, finale: TipoIndice);
var
B : TipoVettore;
primo, secondo, appoggio : integer;
da_copiare : TipoIndice;
begin
primo := iniziale;
secondo := mediano + 1;
appoggio := iniziale;
while (primo <= mediano) and (secondo <= finale) do
begin
if (A[primo] <= A[secondo]) then
begin
B[appoggio] := A[primo];
primo := primo + 1
end
else
begin
B[appoggio] := A[secondo];
secondo := secondo + 1
end;
appoggio := appoggio + 1;
end;
if secondo > finale then
for da_copiare := primo to mediano do
begin
B[appoggio] := A[da_copiare];
appoggio := appoggio + 1
end
else
for da_copiare := secondo to finale do
begin
B[appoggio] := A[da_copiare];
appoggio := appoggio + 1
end;
for da_copiare := iniziale to finale do
A[da_copiare] := B[da_copiare]
end;
procedure MergeRicorsivo (var A: TipoVettore;
iniziale, finale: TipoIndice);
var
mediano : TipoIndice;
begin
if iniziale < finale then
begin
mediano := (iniziale + finale) div 2;
MergeRicorsivo(A, iniziale, mediano);
MergeRicorsivo(A, mediano+1, finale);
MergeVettore(A, iniziale, mediano, finale)
end
end;
begin
MergeRicorsivo(A, 1, NumElementi)
end;