Fonction Servant a classer les Elements d'un Dataset a la maniere QuickSort
à partir d'un numero de colonne passé en parametre,
et pour une colonne contenant des entiers
Source / Exemple :
'Function Quicksort de Tri Rapide a partir de Champ d'entiers
Public Function intQsort(ByVal g As Integer, ByVal d As Integer, ByRef DT As DataTable, ByVal int_Champ As Integer) As Boolean
Dim int_Deb, int_Fin As Integer 'Bornes du Tableau
Dim i, m As Integer
'Champs Temporaires du dataset
Dim int_IdTemp, int_IdBaseTemp, int_IdTypeTemp As Integer
Dim Str_NomTemp As String
m = g
'On Considere le Point g element gauche du tableau comme Pivot rem: il pourrait etre plsu optimisé de le prendre aleatoirement
'm : curseur suivant l'empilement des elements deplacés
If g < d Then 'Condition d'arret du QuickSort
'on place a droite tout les elements inferieur au pivot et a gauche tout ce superieur au pivot
For i = g + 1 To d
If CInt(DT.Rows.Item(i).Item(int_Champ)) < CInt(DT.Rows.Item(g).Item(int_Champ)) Then 'alors Inferieur au pivot
'Placement à Gauche
m += 1
int_IdTemp = DT.Rows.Item(m).Item("ID")
int_IdBaseTemp = DT.Rows.Item(m).Item("Base")
int_IdTypeTemp = DT.Rows.Item(m).Item("Type")
Str_NomTemp = DT.Rows.Item(m).Item("Nom")
DT.Rows.Item(m).Item("ID") = DT.Rows.Item(i).Item("ID")
DT.Rows.Item(m).Item("Base") = DT.Rows.Item(i).Item("Base")
DT.Rows.Item(m).Item("Type") = DT.Rows.Item(i).Item("Type")
DT.Rows.Item(m).Item("Nom") = DT.Rows.Item(i).Item("Nom")
DT.Rows.Item(i).Item("ID") = int_IdTemp
DT.Rows.Item(i).Item("Base") = int_IdBaseTemp
DT.Rows.Item(i).Item("Type") = int_IdTypeTemp
DT.Rows.Item(i).Item("Nom") = Str_NomTemp
End If
Next
'on place le pivot a la fin des elements modifiés puisque celui ci est plus grand que les elements deplacés
int_IdTemp = DT.Rows.Item(m).Item("ID")
int_IdBaseTemp = DT.Rows.Item(m).Item("Base")
int_IdTypeTemp = DT.Rows.Item(m).Item("Type")
Str_NomTemp = DT.Rows.Item(m).Item("Nom")
DT.Rows.Item(m).Item("ID") = DT.Rows.Item(g).Item("ID")
DT.Rows.Item(m).Item("Base") = DT.Rows.Item(g).Item("Base")
DT.Rows.Item(m).Item("Type") = DT.Rows.Item(g).Item("Type")
DT.Rows.Item(m).Item("Nom") = DT.Rows.Item(g).Item("Nom")
DT.Rows.Item(g).Item("ID") = int_IdTemp
DT.Rows.Item(g).Item("Base") = int_IdBaseTemp
DT.Rows.Item(g).Item("Type") = int_IdTypeTemp
DT.Rows.Item(g).Item("Nom") = Str_NomTemp
'le pivot est a la bonne place, on repete l'operation pour les elements de gauche et ceux de droite par rapport au curseur m
'quick sort a Gauche
If intQsort(g, m - 1, DT, int_Champ) = False Then
intQsort = False
Exit Function
End If
'quickSort a Droite
If intQsort(m + 1, d, DT, int_Champ) = False Then
intQsort = False
Exit Function
End If
End If
intQsort = True
End Function