J'ai testé les tris des listes et tableaux depuis longtemps et j'avais fini par adopter le code du soldat inconnu qui je pense est fiable même si c'est un long sur de très grandes listes (?).
voir ici le post de LSI
http://www.purebasic.fr/french/viewtopic.php?f=1&t=9286
Sur le tri des liste chainées dont il est question, j'avais testé et il fallait que je tri d'abord le 2ème champ puis le premier pour obtenir un résultat qui semblait correct.
Comme je n'en suis toujours pas sur, je n'effectue pas plusieurs tris de suite de cette manière dans mes codes.
Je me trompe peut-être mais à vrai dire je n'en sait rien.
Codes de test qui montrent qu'en triant le 1er champ d'abord puis le second ensuite, cela ne va pas pour les tableaux.
Pour les listes chainées, je trie d'abord le second puis le 1er, cela semble être bon. Maintenant inverser les 2 tris des listes chainées et regardez le résultat.
Code : Tout sélectionner
Define .i
EnableExplicit
Structure Test
Champs1.i
Champs2.i
EndStructure
Global NewList MaList.Test()
Global Dim Tableau.Test(99)
Global i
For i = 0 To 99
If AddElement(MaList()) = 0
MessageRequester("Erreur","Impossible d'llouer de la mémoire" +Chr(10) + "Arrêt du tri",16)
End
EndIf
MaList()\Champs1 = Random(8, 0)
MaList()\Champs2 = Random(1000, 100)
Tableau(i)\Champs1 = Random(100, 0)
Tableau(i)\Champs2 = Random(1000, 100)
Next
;// tri de la liste en commençant par le 2ème champ
SortStructuredList(MaList(), #PB_Sort_Ascending, OffsetOf(Test\Champs2), #PB_Integer)
SortStructuredList(MaList(), #PB_Sort_Ascending, OffsetOf(Test\Champs1), #PB_Integer)
;// tri du tableau en commençant par le 1er champ
SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Champs1), #PB_Integer)
SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Champs2), #PB_Integer)
Debug "tri de la liste"
ForEach MaList()
Debug Str(MaList()\Champs1) + " - " + Str(MaList()\Champs2)
Next
Debug ""
Debug "tri du tableau"
For i = 0 To 99
Debug Str(Tableau(i)\Champs1) + " - " + Str(Tableau(i)\Champs2)
Next