Bonjour,
Voila je fais un tri d'un tableau a deux dimensions par méthode dichotomique.
Ce dernier fonctionne bien sauf que le premier élément du tableau n'est pas trié je ne comprend pas pourquoi.
Pour info :
Voila le code :Le tri dichotomique :
Les explications sont données pour le tri croissant.
Le principe est simple, on prend l'élément N du tableau, et on le compare aux éléments 1 à N - 1 du même tableau. On en déduit la position M qu'il devrait occupé et on décale tous les éléments M à N - 1 (ex: M prend la position M + 1) puis on place l'élément de dépard à la position M.
On effectue cette opération pour tous les éléments de 2 jusqu'à Nb_élément.
La fonction :
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 Sens = True coltab = 0 For Idico = 2 To nbligne If (Tabval(Idico, coltab) < Tabval(Idico - 1, coltab) And Sens) Or (Tabval(Idico, coltab) > Tabval(Idico - 1, coltab) And Not Sens) Then ' Si l'élément Idico est supérieur à l'élément 1 ' alors il faut déterminer sa place ' Sinon l'élément Idico doit prendre la première place If (Tabval(Idico, coltab) > Tabval(1, coltab) And Sens) Or (Tabval(Idico, coltab) < Tabval(1, coltab) And Not Sens) Then Pdico = DichoPlacer(Idico, Tabval(), coltab, Sens) Else Pdico = 1 End If ' Décalage du tableau Ligne_Tampon = Tabval(Idico, coltab) For Jdico = Idico To Pdico + 1 Step -1 Tabval(Jdico, coltab) = Tabval(Jdico - 1, coltab) Next Jdico Tabval(Pdico, coltab) = Ligne_Tampon End If Next Idico
Merci de votre aide
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 Public Function DichoPlacer(Idico As Long, Tabval() As Variant, coltab As Integer, ByVal Sens As Boolean) As Long ' le paramètre I représente la position de l'élément à classé ' le paramètre Tabval() est le tableau à trier, il est modifié puis retourné ' le paramètre Sens est vrai pour un tri croissant ' DichoPlacer renvoi la nouvelle position de l'élément à classer Dim inf As Long Dim sup As Long Dim milieu As Long inf = 1 sup = Idico - 1 Do While inf <> sup milieu = (inf + sup) \ 2 If (Tabval(milieu, coltab) <= Tabval(Idico, coltab) And Sens) Or (Tabval(milieu, coltab) >= Tabval(Idico, coltab) And Not Sens) Then inf = milieu + 1 Else sup = milieu End If Loop DichoPlacer = inf End Function
Partager