Je désire vous parler du tri par sélection.
J'explique un peu le fonctionnement pour ceux qui ne connaissent pas ou qui ont oublié; le tri par sélection consiste à sélectionner le plus petit (ou plus grand selon l'ordre croissant ou décroissant avec lequel on veut trier le tableau) élément dans la partie non triée et le mettre à sa place en permutant avec la case qui le renferme.
Voici son algorithme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 procedure triselection(var table:tab; n:integer); var ind_max,i:integer; begin for i:=1 to (n-1) do if max(table,i,n) <> i then permutation(table[max(table,i,n)],table[i]); end;
La fonction max retourne l'indice du maximum d'une partie d'un tableau, cernée par les cases d (pour début) et f. Cf optionellement le code.
La procédure permutation permute les valeurs de deux éléments quelconques.
On nous propose de l'améliorer en plaçant le plus grand et le plus petit en même temps. C'est à dire que lorsqu'on place le plus petit parmi les non triés à la première case on place le plus grand à la dernière, quand on place le second dans la 2e case on place aussi l'avant dernier dans l'avant dernière...
Ce qui donne ça :
Code en entier si besoin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure triselection(var table:tab; n:integer); var ind_max,i:integer; begin for i:=1 to (n div 2) do begin if max(table,i,n+1-i) <> i then permutation(table[max(table,i,n)],table[i]); if min(table,i,n+1-i) <> n+1-i then permutation(table[min(table,i,n+1-i)],table[n+1-i]); end; end;
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 program pp; uses wincrt; type tab=array[1..50] of integer; procedure remptab(var table:tab;n:integer); var i:integer; begin for i:=1 to n do begin write('valeur numéro ', i,' du tableau : '); read(table[i]); end; writeln; for i:=1 to n do write(table[i]:6); end; function max(table:tab; d,f:integer):integer; var j,ind:integer; begin ind:=d; for j:=d+1 to f do if table[j]>table[ind] then ind:=j; max:=ind end; function min(table:tab; d,f:integer):integer; var j,ind:integer; begin ind:=d; for j:=d+1 to f do if table[j]<table[ind] then ind:=j; min:=ind end; procedure permutation(VAR v,v2:integer); var e:integer; begin e:=v; v:=v2; v2:=e; end; procedure triselection(var table:tab; n:integer); var ind_max,i:integer; begin for i:=1 to (n div 2) do begin if max(table,i,n+1-i) <> i then permutation(table[max(table,i,n)],table[i]); if min(table,i,n+1-i) <> n+1-i then permutation(table[min(table,i,n+1-i)],table[n+1-i]); end; end; var t:tab; n,i:integer; begin repeat write('n ? '); read(n) until n in [2..30]; remptab(T,n); writeln; triselection(t,n); for i:=1 to n do write(t[i]:6); end.
La question maintenant est : a-t-on amélioré l'algorithme du tri ? Expliquez s'il vous plaît.
Merci.
Partager