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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.