Erreur sur tri bulle..

SylvainPG

XLDnaute Nouveau
ub Bouton6_QuandClic() 'effectue un tri bulle
Salut le forum!!

Bon je vous explique, j'essaye depuis ce matin de faire mon tri bulle. Il fonctionne mais à moitié, j'aimerais savoir si l'un d'entre vous à une idée à ce sujet. Sachant que Tablo est définit de 2 à Ubound(Tablo). Le tri fonctionne mais il ne commence pas à la valeur la plus basse et au bout d'un moment il ne tri plus le tableau (cependant, il permute toujours certaines valeurs...)

J'ai évidemment cherché sur internet, sur le forum, dans les bouquin. Mais je ne vois pas d'explication.

Bonne journée mesdames, mesdemoiselles, messieurs




For h = LBound(tablo) To UBound(tablo)
For k = 2 To h - 1
If tablo(k) > tablo(k + 1) Then
tmp = tablo(k)
tablo(k) = tablo(k + 1)
tablo(k + 1) = tmp
End If
Next k
Next h



For i = 2 To UBound(tablo)
Sheets("repartition_masses").Cells(20, i) = tablo(i)
Next i
End Sub
 

skoobi

XLDnaute Barbatruc
Re : Erreur sur tri bulle..

Bonjour,

pour trier un tableau à 1 dimension, je te propose ce code:

Code:
For i = LBound(tableau) To UBound(tableau)
    For j = i + 1 To UBound(tableau)
'        If tableau(i) > tableau(j) Then 'tri croissant
        If tableau(i) < tableau(j) Then 'tri décroissant
            Temp = tableau(j)
            tableau(j) = tableau(i)
            tableau(i) = Temp
        End If
    Next j
Next i
Adapte le à ton cas.
Tu mets en commentaire le tri non souhaité, ici croissant.
 

SylvainPG

XLDnaute Nouveau
Re : Erreur sur tri bulle..

Re salut le forum!!

Bon j'ai trouver, comme un grand :)
Voila la solution que j'ai trouvé: la boucle i se place à la fin du tableau (tri bulle classique), mais visiblement si on dit à vba de faire par exemple une boucle For i= 10 to 2, et bien il faut lui préciser le Step -1 pour qu'il parcoure les valeurs 10, 9,8,7,.....,2. Est-ce vrai???? (je fais mes conclusions tout seul...)

Lorsque j'ai posté mon problème je n'avais pas écris mon code de cette façon là, il me semble que le vrai tribulle se construit comme cela avec un curseur qui se place à la fin, un autre qui commence au début (boucle j). La boucle J intervertit les valeur si un chiffre est supérieur à son suivant jusque la position du curseur i...

Si vous voulez le code en entier pour voir le contexte, demandez sur ce post ;)

@+




For i = UBound(tablo) To LBound(tablo) Step -1

For j = LBound(tablo) To i - 1
If tablo(j) > tablo(j + 1) Then
tmp = tablo(j)
tablo(j) = tablo(j + 1)
tablo(j + 1) = tmp
End If
Next j
Next i




For i = 2 To UBound(tablo)
Sheets("repartition_masses").Cells(20, i) = tablo(i)
Next i
End Sub
 

Roland_M

XLDnaute Barbatruc
Re : Erreur sur tri bulle..

bonsoir

Ceci est un tri rapide
pratiquement aussi rapide que le Tri QuickSort mais sans récursivité

Code:
Sub TriRapide(Liste())
DebListe = LBound(Liste())
FinListe = UBound(Liste())
X = FinListe / 2
Do While X
 For A = DebListe To FinListe - X
  If Liste(A) > Liste(A + X) Then
     VarTemp = Liste(A): Liste(A) = Liste(A + X): Liste(A + X) = VarTemp
     For B = A - X To DebListe Step -X
      If Liste(B + X) >= Liste(B) Then Exit For
      VarTemp = Liste(B): Liste(B) = Liste(B + X): Liste(B + X) = VarTemp
     Next
  End If
 Next: X = X / 2
Loop
End Sub

Roland
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Re : Erreur sur tri bulle..

re

explication (sauf erreur de frappe car j'ai fais vite)
(s'il y a mieux n'hésitez pas à nous en faire profiter :D)


Roland
 

Pièces jointes

  • ModuleTris.xls
    31.5 KB · Affichages: 46
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Erreur sur tri bulle..

Bonjour,

Tri Quick-sort : 0,05 s pour 10.000 éléments

Code:
Sub essai()
  Dim temp(10000) As Double
  For i = 1 To 10000
     temp(i) = Rnd
  Next i
  t = Timer
  Call tri(temp, 1, 10000)
  MsgBox Timer - t
End Sub

Sub tri(a() As Double, gauc, droi) ' Quick sort
   ref = a((gauc + droi) \ 2)
   g = gauc: d = droi
   Do
      Do While a(g) < ref: g = g + 1: Loop
      Do While ref < a(d): d = d - 1: Loop
        If g <= d Then
           temp = a(g): a(g) = a(d): a(d) = temp
           g = g + 1: d = d - 1
        End If
    Loop While g <= d
    If g < droi Then Call tri(a, g, droi)
    If gauc < d Then Call tri(a, gauc, d)
End Sub

JB
Formation Excel VBA JB
 

Roland_M

XLDnaute Barbatruc
Re : Erreur sur tri bulle..

bonjour

Merci à toi BOISGONTIER d'avoir apporté un peu d'eau à mon moulin ;)

et pour ce qui est du numérique ou de l'alphanumérique,
c'est évident que cela fonctionne ! il suffit de déclarer ses tableaux()

Cordialement. Roland
 

skoobi

XLDnaute Barbatruc
Re : Erreur sur tri bulle..

bonjour
c'est évident que cela fonctionne ! il suffit de déclarer ses tableaux()

Cordialement. Roland

Re,

tout dépend de la procédure car dans mon livre il y a un exemple de tri "QuickSort" pour lequel est spécifié que cette procédure marche uniquement pour les nombres. Il est vrai qu'elle est différente de celle de JB. Voilà pour l'anecdote.

Edit: En tout cas merci à toi JB, ma macro s'executera plus vite :)

Bonne après-midi.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 113
Messages
2 085 427
Membres
102 889
dernier inscrit
monsef JABBOUR