Puisque je suis entrain d'étudier les différentes algorithme de tri,
j'ai étudier le tri shell bref j'ai compris ses instruction mais il ne marche pas,
voila le programme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
program tri_shell;
uses wincrt;
 
type
tab=array[1..100]of integer;
var
t:tab;
n:integer;
 
procedure remplir(var t:tab;n:integer);
var
i:integer;
begin
Randomize;
for i:=1 to n do
begin
t[i]:=Random(100);
end;
end;
 
procedure affichage(t:tab;n:integer);
var
i:integer;
begin
for i:=1 to n do
begin
if(t[i]>=0)then
write(t[i]:3);
end;
end;
 
procedure shell (n: integer ; var t:tab ) ;
var    p,i,j,valeur: integer;
 begin    
     p:=0;
     while p < n do    
     p:= 3*p+1;
     while p > 0 do
      begin
          p:=p div 3;
          for i:= p to n do
           begin
                valeur:=t[i];
                j:=i;
                while (j > p-1) and (t[j-p] > valeur ) do
                 begin
                      t[j]:=t[j-p];
                      j:=j-p;
                 end;
                t[j]:=valeur;
           end;
      end;
 end;
 
 
begin
repeat
writeln('la taille du tableau');
readln(n);
until(n>0);
 
remplir(t,n);
 
affichage(t,n);
writeln('');
 
Shell(n,t);
affichage(t,n);
end.
j'ai ai pas bien aimer cet algorithme en tout cas il ne marche pas.
c'est pourquoi je propose ce code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
procedure Shell(n : integer ; var t : tab);
var
  p, k, i, j ,x : 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 <> 1) do
  begin
    (* On affine peu à peu le Gap            *)
    (* Gap = 1 ==> Tri par Insertion ordinaire *)
    p := p div 3;
    if(p=1)then 
             x:=n 
             else 
             x:=n mod p;
    for i := 1 to x do
    begin
      k := t[i]; (* Valeur à insérer *)
 
      (* Recherche de la position d'insertion *)
      j:= i;
      while (j > p ) 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;
Si il est possible de l'essayer(juste remplacer la procédure proposer par l'existante)et pourquoi pas me donner soit les avantages ou les inconvénient de cet algorithme ou si j'ai pas changer rien du tout.
Merci.