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
j'ai ai pas bien aimer cet algorithme en tout cas il ne marche pas.
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.
c'est pourquoi je propose ce code
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.
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;
Merci.
Partager