Implémenter des algorithmes de tri avancés, Excel VBA

Implémenter des algorithmes de tri avancés, Excel VBA

Voici une explication détaillée pour implémenter des algorithmes de tri avancés en VBA Excel, en mettant l’accent sur deux algorithmes de tri bien connus : QuickSort et MergeSort. Je vais vous guider étape par étape sur la façon de les implémenter dans VBA avec des explications détaillées.
1. Algorithme QuickSort en VBA
QuickSort est un algorithme de tri par diviser pour régner. Il fonctionne en choisissant un élément pivot, en partitionnant les autres éléments autour de ce pivot, puis en triant récursivement les sous-tableaux.
Étapes pour implémenter QuickSort en VBA :
1. Choisir un pivot (généralement le dernier élément).
2. Partitionner le tableau en deux sous-tableaux : les éléments inférieurs au pivot et ceux supérieurs.
3. Appliquer récursivement la méthode de tri aux deux sous-tableaux.
Voici comment vous pouvez l’implémenter en VBA :

Sub ExempleQuickSort()
    Dim arr As Variant
    arr = Array(3, 7, 8, 5, 2, 1, 4, 6) ' Tableau d'exemple
    ' Appeler la fonction QuickSort
    QuickSort arr, LBound(arr), UBound(arr)
    ' Afficher le tableau trié dans la fenêtre immédiate (Ctrl + G)
    For i = LBound(arr) To UBound(arr)
        Debug.Print arr(i)
    Next i
End Sub
' Fonction QuickSort
Sub QuickSort(ByRef arr As Variant, ByVal low As Long, ByVal high As Long)
    Dim pivot As Long
    Dim i As Long, j As Long
    Dim temp As Variant
    If low < high Then
        ' Choisir un pivot et partitionner le tableau
        pivot = Partition(arr, low, high)
        ' Tri récursif des sous-tableaux
        QuickSort arr, low, pivot - 1
        QuickSort arr, pivot + 1, high
    End If
End Sub
' Fonction de partition pour réarranger les éléments autour du pivot
Function Partition(ByRef arr As Variant, ByVal low As Long, ByVal high As Long) As Long
    Dim pivot As Variant
    Dim i As Long, j As Long
    Dim temp As Variant
    pivot = arr(high) ' Le dernier élément est le pivot
    i = low - 1 ' Pointeur pour les éléments inférieurs au pivot
    For j = low To high - 1
        If arr(j) <= pivot Then
            i = i + 1
            ' Échanger arr(i) et arr(j)
            temp = arr(i)
            arr(i) = arr(j)
            arr(j) = temp
        End If
    Next j
    ' Échanger arr(i + 1) et arr(high) (le pivot)
    temp = arr(i + 1)
    arr(i + 1) = arr(high)
    arr(high) = temp
    Partition = i + 1 ' Retourner l'indice du pivot
End Function

Explication du code QuickSort :
1. Sous-routine QuickSort :

  • Cette sous-routine prend un tableau arr et le trie en place.
  • Elle appelle la fonction Partition pour réarranger le tableau puis trie récursivement les sous-tableaux.
  • low et high sont les indices qui indiquent le sous-tableau actuellement trié.

2. Fonction Partition :

  • Le pivot est sélectionné comme étant le dernier élément du sous-tableau (arr(high)).
  • Elle réorganise les éléments pour que tous les éléments inférieurs au pivot se trouvent à gauche et tous les éléments supérieurs à droite.
  • Elle retourne l’indice du pivot, qui divise le tableau en deux sous-tableaux.

2. Algorithme MergeSort en VBA
MergeSort est également un algorithme de tri par diviser pour régner. Il divise le tableau en deux sous-tableaux, les trie récursivement, puis les fusionne pour obtenir un tableau trié.
Étapes pour implémenter MergeSort en VBA :
1. Diviser le tableau en deux moitiés.
2. Trier récursivement les deux moitiés.
3. Fusionner les deux sous-tableaux triés.
Voici comment l’implémenter en VBA :

Sub ExempleMergeSort()
    Dim arr As Variant
    arr = Array(3, 7, 8, 5, 2, 1, 4, 6) ' Tableau d'exemple
    ' Appeler la fonction MergeSort
    MergeSort arr, LBound(arr), UBound(arr)
    ' Afficher le tableau trié dans la fenêtre immédiate (Ctrl + G)
    For i = LBound(arr) To UBound(arr)
        Debug.Print arr(i)
    Next i
End Sub
' Fonction MergeSort
Sub MergeSort(ByRef arr As Variant, ByVal low As Long, ByVal high As Long)
    Dim mid As Long
    If low < high Then
        mid = (low + high) \ 2 ' Trouver le milieu du tableau
        ' Trier récursivement les moitiés gauche et droite
        MergeSort arr, low, mid
        MergeSort arr, mid + 1, high
        ' Fusionner les deux moitiés triées
        Merge arr, low, mid, high
    End If
End Sub
' Fonction Merge pour fusionner deux moitiés triées
Sub Merge(ByRef arr As Variant, ByVal low As Long, ByVal mid As Long, ByVal high As Long)
    Dim tempArr() As Variant
    Dim i As Long, j As Long, k As Long
    Dim leftSize As Long, rightSize As Long
    leftSize = mid - low + 1
    rightSize = high - mid
    ' Créer des tableaux temporaires pour les deux moitiés
    ReDim leftArr(leftSize - 1)
    ReDim rightArr(rightSize - 1)
    ' Copier les données dans les tableaux temporaires
    For i = 0 To leftSize - 1
        leftArr(i) = arr(low + i)
    Next i
    For j = 0 To rightSize - 1
        rightArr(j) = arr(mid + 1 + j)
    Next j
    i = 0
    j = 0
    k = low
    ' Fusionner les tableaux temporaires dans le tableau original
    While i < leftSize And j < rightSize
        If leftArr(i) <= rightArr(j) Then
            arr(k) = leftArr(i)
            i = i + 1
        Else
            arr(k) = rightArr(j)
            j = j + 1
        End If
        k = k + 1
    Wend
    ' Copier les éléments restants de leftArr ou rightArr
    While i < leftSize
        arr(k) = leftArr(i)
        i = i + 1
        k = k + 1
    Wend
    While j < rightSize
        arr(k) = rightArr(j)
        j = j + 1
        k = k + 1
    Wend
End Sub

Explication du code MergeSort :
1. Sous-routine MergeSort :

  • Cette sous-routine divise récursivement le tableau en deux moitiés jusqu’à ce que chaque sous-tableau ait une seule valeur.
  • Elle appelle ensuite la fonction Merge pour fusionner les sous-tableaux triés.

2. Fonction Merge :

  • La fonction Merge fusionne deux sous-tableaux triés en un seul tableau trié.
  • Elle utilise des tableaux temporaires (leftArr et rightArr) pour stocker les deux moitiés du tableau et les fusionner dans l’ordre.

Comment utiliser ces algorithmes de tri :

  • Vous pouvez appeler la procédure ExempleQuickSort ou ExempleMergeSort dans l’éditeur VBA pour tester ces algorithmes de tri.
  • Vous pouvez remplacer le tableau d’exemple arr par n’importe quelle plage de données dans Excel, par exemple :

arr = Range("A1:A10").Value ' Obtenir les valeurs des cellules A1 à A10
Assurez-vous que la plage contient des données numériques pour le tri.
Conclusion :
Les algorithmes QuickSort et MergeSort sont deux des algorithmes de tri les plus efficaces. QuickSort est généralement plus rapide en raison de sa stratégie de partition, mais MergeSort est plus prévisible en termes de performance car il garantit une complexité en temps de O(n log n) dans le pire des cas. Vous pouvez implémenter l’un ou l’autre de ces algorithmes dans VBA selon vos besoins et la taille des données à trier.

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x