Tri Qsort en VBA d'un tableau à deux dimensions en prenant la première dimension

néné06

XLDnaute Accro
Bonjour le Forum,

J'ai, dans le programme en pièce jointe, un tirage aléatoire de n nombres qui sont mémorisés en mem(Nb,0).
Dans un deuxième temps, je rempli le tableau "Tableau(nb)" d'une dimension, avec les éléments du tableau"mem(Nb,0)" qui est à deux dimensions, afin de pouvoir exécuter ma routine Qsort, car je ne connais pas les instructions pour que le tri "QuickSort" fonctionne depuis un tableau à deux dimensions.

Si l'un d'entre vous pouvait me "corriger" ce programme pour exécuter le tri depuis un tableau à deux éléments?

D'avance merci!

René

Code:
Sub QSort(t() As Long, Deb As Long, Fin As Long)
    Dim i As Long         'indice
    Dim j As Long         'indice
    Dim Pivot As Long     'valeur pivot
    Dim Temp As Long      'Valeur temporaire
    'Algo Tri
    i = Deb   'sauve le début
    j = Fin    'sauve la fin
    Pivot = t((i + j) \ 2)  'valeur pivot
            Do
                Do While t(i) < Pivot: i = i + 1: Loop 'recherche par la bas
                Do While t(j) > Pivot: j = j - 1: Loop 'recherche par le haut
                    If i <= j Then
                        Temp = t(i)     'inversion t(i) et t(j)
                        t(i) = t(j)
                        t(j) = Temp
                        i = i + 1       'Passe au suivant
                        j = j - 1
                    End If
            Loop Until i > j
        If j > Deb Then QSort t(), Deb, j   'trie par le bas
        If i < Fin Then QSort t(), i, Fin   'trie par le haut
End Sub
Public Sub travail()
    Range("A2:Z1000005").ClearContents 'Efface
    Dim mem()
    Dim t As Long
    Nb = Val(InputBox("entrez un nombre de 1 à 1000000"))
    z = Nb
    ReDim mem(Nb, 1)
    ReDim Tableau(Nb) As Long
    Application.ScreenUpdating = False
        For i = 1 To Nb
            mem(i - 1, 1) = i 'mem d'index ou figure les nombres à la suite(1,2,3etc...), que je veux mélanger
        Next
    z = Nb 'z= pointeur qui va être décrementé
    Randomize
        For t = 1 To z 'z perd 1 à chaque boucle
            s = Int((z * Rnd)) + 1 's= nombre aléatoire entre 1 et z
            mem(t - 1, 0) = mem(s - 1, 1) 'les indice des deux memx démare à 0 :valeur en tab "mem1" = valeur trouvée en tab "mem", indice aléa de 1 à z
            '*******************   Placer variable de mem(x,0) en Tableau(t)  ********************
            Tableau(t) = mem(t - 1, 0) '********    Ici je place les valeurs de mem(Nb,0) dans Tableau(Nb)   ********************
            '***************************************************************************************
            mem(s - 1, 1) = mem(z - 1, 1) 'la valeur trouvée en "mem" et tranférée en "mem1" devient la derniere valeur z du mem "mem "
            z = z - 1 'décrémente z pour tirage aléatoire plus petit ( mem "mem" diminue à chaque boucle
        Next
        If Nb > 1 Then [a2].Resize(UBound(mem, 1)).Value = mem 'affichage du tableau mem(Nb,0) en colonne A
    Application.ScreenUpdating = True
    QSort Tableau(), 0, UBound(Tableau) 'Tri Qsort du tableau Tableau(Nb)
End Sub
 

Pièces jointes

  • Tri Qsort.xlsm
    22.8 KB · Affichages: 35

Dranreb

XLDnaute Barbatruc
Re : Tri Qsort en VBA d'un tableau à deux dimensions en prenant la première dimension

C'est justement pour ça que j'ai créé un module de classe TableIndex qui permet de classer n'importe quoi en Quick-Sort amélioré, vu que c'est le programme utilisateur qui effectue les comparaisons, l'objet TableIndex lui indiquant seulement ce qu'il doit comparer.
De plus il peut établir directement une liste de nombres en désordre sans trou. Il suffit de répondre n'importe quoi à la comparaison qu'il demande ! (.BInfA = Rnd > 0.5)
 

Pièces jointes

  • TidxNéné06.xlsm
    31.6 KB · Affichages: 41
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Tri Qsort en VBA d'un tableau à deux dimensions en prenant la première dimension

Je l'ai joint poste précédent. À part ça il est bien dans un bon tiers des classeur que je joins au discussions auxquelles je répond, car il sert à énormément de choses (ComboBox liées, rapport personnalisés notamment). Il est le fondement d'un tas de modules de service.
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 125
Membres
112 666
dernier inscrit
Coco0505