Voilà le tri shell en Pascal
program tri_par_shell;
uses wincrt;
const nmax = 50;
type tab = array[1..nmax] of integer;
var
ti : tab;
i, j, n, x, k,aux :integer;
function lecture : integer;
var
n: integer;
begin
repeat
writeln('donner un entier positif entre 1 et ',nmax);
read(n);
until(n in [1..nmax]);
lecture :=n;
end;
procedure remplir(var t : tab; a : integer);
var
i : integer;
begin
writeln('remplissage de tableau');
for i:=1 to a do
read(t[i]);
end;
procedure permut(a,b: integer);
var
aux : integer;
begin
aux:=a;
a:= b;
b :=aux;
end;
procedure Tri_Shell(n : integer ; var t : tab);
var
p, k, i, j : integer;
begin
(* Recherche du Gap optimal qui est le résultat de *)
(* la suite récurrente : Un = 3.Un-1 + 1 *)
(* Tel que Un < n (Nombre d'éléments du tableau) *)
p := 0;
while (p < n) do p := 3 * p + 1;
while (p <> 0) do
begin
(* On affine peu à peu le Gap *)
(* Gap = 1 ==> Tri par Insertion ordinaire *)
p := p div 3;
for i := p to n do
begin
k := t[i]; (* Valeur à insérer *)
(* Recherche de la position d'insertion *)
j:= i;
while (j > p - 1) and (t[j - p] > k) do
begin
t[j] := t[j - p];
j := j - p;
end;
(* Insertion de la valeur à son emplacement *)
t[j] := k;
end;
end;
end;
procedure affiche (t: tab; a:integer);
var
i : integer;
begin
for i:=1 to n do
writeln(t[i]);
end;
begin
n :=lecture;
remplir(Ti,n);
tri_shell(n,ti);
writeln(' affichage');
affiche(Ti,n);
end.