program application_Tri;
uses wincrt ;
Type
TAB = array[1..100] of integer;
Var
T:TAB;
N,p:integer;
{========== CORPS DE LA PROCEDURE DE TAILLE ===========}
{ UN PEU DE RECURSIVITE POUR LA SAISIE DE N PAS MAL }
procedure taille(Var N: integer);
Begin
read(N);
if NOT (N in [1..100]) then
taille(N);
End;
{========== CORPS DE LA PROCEDURE REMPLISSAGE ===========}
procedure remplissage( var T:TAB ; N:integer) ;
Begin
if (N=1) then readln(T[1])
else
Begin
readln(T[N]);
remplissage(T,N-1);
End;
End;
{========== CORPS DE LA PROCEDURE DE TRI ===========}
procedure shell_itr(var t:tab;n:integer);
var
i,j,p,tmp:integer;
begin
p:=1;
while(p<n)do
p:=3*p+1;
while (p>1) do
begin
p:=p div 3;
for i:= p+1 to n do
begin
tmp:=t[i];
j:=i;
while((j>p) and (tmp<t[j-p])) do
begin
t[j]:=t[j-p];
j:=j-p;
end;
t[j]:=tmp;
end;
end;
end;
{========== CORPS DE LA PROCEDURE AFFICHAGE ===========}
procedure affichage( T:TAB ; N:integer);
var
i:integer;
Begin
for i:=1 to N do
write(T[i],' | ');
End;
{========== CORPS DE PROGRAMME PRINCIPAL ===========}
Begin
write('quelle est la taille de votre tableau ? .........: ');
taille(N);
writeln('commencer à remplir le tableau :');
remplissage(T,N);
{clrscr; }
writeln('Contenu du tableau AVANT le TRI ');
affichage(T,N);
p:=0;
while (p<=N) do
p:=3*P+1;
shell_itr(t,n);
writeln;
writeln('Contenu du tableau APRES le TRI ');
affichage(T,N);
End.