Sortare prin interclasare(mergesort)
Tabloul unidimensional V se completeaza cu n numere reale. Sa se ordoneze crescator folosind sortare prin interclasare.
Sortarea prin interclasare se bazeaza pe urmatoarea logica :
vectorul V se imparte ,prin injumatatiri succesive ,in vectori din ce in ce mai mici ;cand se ating vectorii de maxim doua elemente ,fiecare dintre acestia se ordoneaza printr-o simpla comparare a elementelor ;cate doi astfel de mini- vectori ordonati se interclaseaza succesiv pana se ajunge iar la vectorul V. 39734mmu66nko3q
program mergesort;
type vector=array[1..50] of real ;
var v:vector ;n,i:word;
procedure schimba(li,ls:word;var a:vector);
var man:real;
begin
if a[li]>a[ls] then begin
man:=a[li];
a[li]:=a[ls];
a[ls]:=man; mk734m9366nkko
end;
end;
procedure interclas(li,m,ls:word;var a:vector);
var b:vector:i,k,p,j:word;
begin
i:=li; j:=m+1; k:=0;
while (i<=m)and(j<=ls) do
begin
inc(k);
if a[i] <a[j] then begin
b[k]:=a[i];
inc(i);
end
else begin
b[k]:=a[j];
inc(j);
end;
end;
if i<=m then for p:=i to m do begin1
inc(k);b[k]:=a[p];
end;
if j<=ls then for p:=j to ls do begin
inc(k) ;b[k]:=a[p];
end;
k:=0;
for p:=li to ls do begin
inc(k);
a[p]:=b[k];
end;
end;
procedure divi(li,ls:word; var a:vector);
var m:word;
begin
if (ls-li)<=1 then schimba(li,ls,a);
else begin
m:=(li+ls)div 2;
divi(li,m,a);
divi(m+1,ls,a);
interclas(li,m,ls,a);
end;
end;
begin
write(‘cate elemente are vectorul?=’);readln(n);
for i:=1 to n do
begin
write(‘tastati elementul’,i,’=’);
readln(v[i]);
end;
divi(1,n,v);
writeln(‘vectorul sortat este:’);
for i:=1 to n do writeln(v[i]);
end.
OBSERVATII
4mecanismul general de tip Divide et Impera se gaseste implementat in procedura “divi” ;
4o astfel de abordare a problemei sortarii unii vector conduce la economie de timp de calcul ,deoarece operatia de interclasare a doi vectori deja ordonati este foarte rapida ,iar ordonarea independenta celor doua jumatati(mini- vectori) consuma in total aproximativ a doua parte din timpul care ar fi necesar ordonarii vectorului luat ca intreg .