Dataset quicksort

Contenu du snippet

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

A voir également