Pour de gros fichiers, il est préférable de prendre en compte la compléxité du tri, la meilleure étant en n.log n, le programme qui suit est un tri par fusion qui admet une complexité en n.log n !
Le type Elem peut être n'importe quoi du moment que l'opération < est un sens entre deux éléments...
Le tri par fusion est très efficace cependant il prend de la place, c'est pourquoi le programme utilise un fichier auxiliaire qu'il créé puis efface (il prends autant de place que le fichier à trier)
program TriParFusion;
type Elem=string; // par exemple
Fichier=file of Elem;
procedure Attribuer(var F,F2:Fichier;i,j:integer); // F[i]:=F2[j]
var s:Elem;
begin
seek(F2,j);
read(F2,s);
seek(F,i);
write(F,s);
end;
function Comparer(var F,F2:Fichier;i,j:integer):boolean; // F[i]<F2[j] ?
var s,t:Elem;
begin
seek(F,i);
read(F,s);
seek(F2,j);
read(F2,t);
result:=(s<t);
end;
procedure TriFusionAux(var F,F2:Fichier; G,D:Integer);
var m,i,j,k:Integer;
begin
if D>G then begin
m:=(G+D) div 2;
TriFusionAux(F,F2,G,m);
TriFusionAux(F,F2,m+1,D);
for i:=m downto G do
Attribuer(F2,F,i,i);
for j:=m+1 To D do
Attribuer(F2,F,d+m+1-j,j);
i:=G;
j:=D;
for k:=G to D do
begin
if Comparer(F2,F2,i,j) then begin
Attribuer(F,F2,k,i);
inc(i);
end
else begin
Attribuer(F,F2,k,j);
dec(j);
end;
end;
end;
end;
procedure TriFusion(Source,Auxiliaire:String);
var F,F2:Fichier; s:Elem;
begin
assign(F,Source);
reset(F);
assign(F2,Auxiliaire);
rewrite(F2);
while not eof(F) do
begin
read(F,s);
write(F2,s);
end;
TriFusionAux(F,F2,0,filesize(F)-1);
close(F2);
erase(F2);
close(F);
end;
var source,auxiliaire:string;
begin
write('Fichier a trier : '); readln(source);
TriFusion(source,source+'.tmp');
end.--
La confiance n'exclut pas le contrôle