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 73 74 75 76 77 78 79 80 81 82 83 84
|
...
const
n=15;
type
Ttab = array[1..n] of integer;
var
tab:Ttab;
i:integer;
procedure Fusionner(var T1,T2:Ttab;_gauche,midle,_droite:integer);
var
iGauchePos,IcurPos,imidlepos,i:integer;
begin
iGauchePos :=_gauche;//on prend la plus petite position
IcurPos :=_gauche;//on prend la plus petite position
imidlepos := midle+1;// on definit le milieu
for i := _gauche to _droite do
T2[i]:=T1[i]; // on recopie le tableau de référence dans le tableau 2
while (iGauchePos<=midle) and (imidlepos<=_droite) do
begin
if T2[iGauchePos]<T2[imidlepos] then
begin
T1[IcurPos]:=T2[iGauchePos];
inc(iGauchePos);
end
else
begin
T1[IcurPos]:=T2[imidlepos];
inc(imidlepos);
end;
inc(IcurPos);
end;
if imidlepos>_droite then
for i := iGauchePos to midle do
begin
T1[IcurPos]:=T2[i];
inc(IcurPos);
end
else
for I := imidlepos to _droite do
begin
T1[IcurPos]:=T2[i];
inc(IcurPos);
end;
end;
//-----------------------------------------------
procedure TriFusion(var T1:Ttab;_gauche,_droite:integer);
var
midle:integer;
T2:Ttab;
begin
if _gauche<_droite then
begin
midle:=(_gauche+_droite)div 2;
TriFusion(T1,_gauche,midle);// on regarde a droite
TriFusion(T1,midle+1,_droite); // on regarde a gauche
Fusionner(T1,T2,_gauche,midle,_droite); // on fusionne
end;
end;
//-----------------------------------------------
... Utilisation
//-----------------------------------------------
var
s : String;
begin
//-----------------------------------------------
// remplissage aleatoire du tableau
//-----------------------------------------------
randomize;
for i := 1 to n do
begin
tab[i]:=random(50)-20;
s := s+inttostr(tab[i])+';';
end;
affiche(s);
TriFusion(tab,1,n);
s := '';
for i := 1 to n do
s := s+inttostr(tab[i])+';';
affiche(s);
end; |
Partager