j'ai cette méthode de tri qui traine aussi
elle peut permettre de mixer les types de données à trier (string et long par exemple), a vous d'adapter le code
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Tri d'une liste chainée composé d'une structure d'abord sur l'élément a de la liste puis sur l'élément c
; On crée une liste chainé avec des valeurs aléatoires
Structure Tableau_Info
a.l
b.l
c.l
EndStructure
NewList Tableau.Tableau_Info()
For n = 1 To 20
AddElement(Tableau())
Tableau()\a = Random(10)
Tableau()\b = Random(20)
Tableau()\c = Random(30)
Next
;- Procédé
; On tri d'abord sur "a"
SortStructuredList(Tableau(), 0, OffsetOf(Tableau_Info\a), #PB_Sort_Long)
; Puis sur "c"
Tri = -1 ; Mettre ici une valeur qui n'existe pas
Compteur = 0
Depart = -1
ForEach Tableau()
If Tri = Tableau()\a ; On compte le nombre d'élément à la suite qui ont "a" égaux
If Depart < 0
Depart = ListIndex(Tableau()) - 1
EndIf
Compteur + 1
Else ; Puis on trie cette liste d'élément sur "c"
If Compteur
SortStructuredList(Tableau(), 0, OffsetOf(Tableau_Info\c), #PB_Sort_Long, Depart, Depart + Compteur)
SelectElement(Tableau(), Depart + Compteur + 1)
EndIf
Compteur = 0
Depart = -1
Tri = Tableau()\a ; On copie la nouvelle valeur pour trouvé la prochaine suite d'élément avec "a" égaux
EndIf
Next
If Compteur ; Si on finis la liste chainée avec une série d'élément "a" égaux
SortStructuredList(Tableau(), 0, OffsetOf(Tableau_Info\c), #PB_Sort_Long, Depart, Depart + Compteur)
EndIf
; On affiche le résultat
ForEach Tableau()
Debug Str(Tableau()\a) + " ; " + Str(Tableau()\b) + " ; " + Str(Tableau()\c)
Next
;- Test de rapidité
ClearList(Tableau())
For n = 1 To 50000
AddElement(Tableau())
Tableau()\a = Random(10)
Tableau()\b = Random(20)
Tableau()\c = Random(50)
Next
Temps1 = ElapsedMilliseconds()
; On tri d'abord sur "a"
SortStructuredList(Tableau(), 0, OffsetOf(Tableau_Info\a), #PB_Sort_Long)
; Puis sur "c"
Tri = -1 ; Mettre ici une valeur qui n'existe pas
Compteur = 0
Depart = -1
ForEach Tableau()
If Tri = Tableau()\a ; On compte le nombre d'élément à la suite qui ont "a" égaux
If Depart < 0
Depart = ListIndex(Tableau()) - 1
EndIf
Compteur + 1
Else ; Puis on trie cette liste d'élément sur "c"
If Compteur
SortStructuredList(Tableau(), 0, OffsetOf(Tableau_Info\c), #PB_Sort_Long, Depart, Depart + Compteur)
SelectElement(Tableau(), Depart + Compteur + 1)
EndIf
Compteur = 0
Depart = -1
Tri = Tableau()\a ; On copie la nouvelle valeur pour trouvé la prochaine suite d'élément avec "a" égaux
EndIf
Next
If Compteur ; Si on finis la liste chainée avec une série d'élément "a" égaux
SortStructuredList(Tableau(), 0, OffsetOf(Tableau_Info\c), #PB_Sort_Long, Depart, Depart + Compteur)
EndIf
Temps2 = ElapsedMilliseconds()
; On affiche le résultat
MessageRequester("Tri", Str(Temps2 - Temps1) + "ms")
une autre méthode un peu plus bête pour trier sur plusieurs éléments d'un tableau.
Elle peut-être un peu moins rapide mais elle fonctionne avec tout les types de variables et elle est facile à faire
l'astuce consiste à ajouter un champ "Tri" dans la structure du tableau
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Trier un tableau avec structure sur plusieurs critères
Structure Valeur
a.s
b.l
c.f
Tri.s
EndStructure
Global NewList Tableau.Valeur()
; Remplissage aléatoire
For n = 1 To 20
AddElement(Tableau())
Tableau()\a = Chr(Random(25) + 65)
Tableau()\b = Random(9)
Tableau()\c = Random(20) / 10
Next
; On veut trier d'abord sur "c" puis sur "a et enfin sur "b"
ForEach Tableau()
Tableau()\Tri = StrF(Tableau()\c) + Tableau()\a + Str(Tableau()\b)
Next
; on trie
SortStructuredList(Tableau(), #PB_Sort_Ascending, OffsetOf(Valeur\Tri), #PB_Sort_String)
; on affiche
ForEach Tableau()
Debug Tableau()\a + " , " + Str(Tableau()\b) + " , " + StrF(Tableau()\c)
Next
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]