Le tri rapide

Signaler
Messages postés
31
Date d'inscription
dimanche 1 janvier 2006
Statut
Membre
Dernière intervention
5 mars 2007
-
Messages postés
2
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
30 juillet 2008
-
merci pour tous les personnes qui m'ont aidez, mais je revien aujourd'hui avec un autre probléme :
j'ai un tableau statique TAB(0 to 5)
as Integer

je vaudrais trier ce tableau en ordre croissant, mais en utilisant le Tri rapide.
merciiiiiiiii

8 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
Il existe plusieurs méthodes de tri.
Il suffit de lire quelques sources que tu trouveras en tapant "méthode tri" puis la recherche par Google.
A toi de faire des essais et de tester la meilleure méthode, mais franchement, avec 6 éléments dans ton tableau, ce n'est pas la peine de te casser la tête à vouloir gagner de la vitesse.
D'autre part, évite sous VB d'utiliser des mots clés du langage pour désigner des variables : TAB n'est pas conseillé (iTab serait bien)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
Messages postés
31
Date d'inscription
dimanche 1 janvier 2006
Statut
Membre
Dernière intervention
5 mars 2007

j'ai des algorihmes de tri rapide mais pour le transformer en visual basic ce me derange un peu. pour cela je demande d'aide, pas c koi le tri rapide ou comment ca marche mais comme j'entrain de te dire le prblm est en vb
merci pour votre compréhension .
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
22
Voilà un exemple de tri. (Tri bulle)









Dim iTab(0 To 5) As Integer

Dim Index_Max_du_Tableau As Long

Dim iTemp As Integer

Dim l, j, k As Long



iTab(0) = 15

iTab(1) = 54

iTab(2) = 64

iTab(3) = 12

iTab(4) = 87

iTab(5) = 77



Index_Max_du_Tableau = 5



For l = 0 To Index_Max_du_Tableau - 1

For k = Index_Max_du_Tableau - l To 1 Step -1

If iTab(k - 1) > iTab(k) Then

iTemp = iTab(k)

iTab(k) = iTab(k - 1)

iTab(k - 1) = iTemp

End If

Next k

Next l


Manu
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
22
Je l'ai réécrit, parce que je me suis rendu compte qu'un L minuscule et
le chiffre 1, ç se ressemble beaucoup en police Courier. Donc là, plus
possible de les confondre :








Dim iTab(0 To 5) As Integer

Dim Index_Max_du_Tableau As Long

Dim iTemp As Integer

Dim ll, k As Long



iTab(0) = 15

iTab(1) = 54

iTab(2) = 64

iTab(3) = 12

iTab(4) = 87

iTab(5) = 77



Index_Max_du_Tableau = 5



For ll = 0 To Index_Max_du_Tableau - 1

For k = Index_Max_du_Tableau - ll To 1 Step -1

If iTab(k - 1) > iTab(k) Then

iTemp = iTab(k)

iTab(k) = iTab(k - 1)

iTab(k - 1) = iTemp

End If

Next k

Next ll

Manu
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
28
Voilà un exemple de tri rapide









' le paramètre Debut correspond au numéro du premier élément à trier

' le paramètre Fin correspond au numéro du dernier élément à trier

' le paramètre Tableau() est le tableau à trier

Sub TriRapide(Debut As Long, Fin As Long, Tableau As Variant)

Dim i As Long

Dim J As Long

Dim Ligne_Milieu As Variant

Dim Ligne_Tampon As Variant



i = Debut

J = Fin

Ligne_Milieu = Tableau((Debut + Fin) \ 2)

Do

While Ligne_Milieu > Tableau(i)

i = i + 1

Wend

While Ligne_Milieu < Tableau(J)

J = J - 1

Wend



If i <= J Then

Ligne_Tampon = Tableau(i)

Tableau(i) = Tableau(J)

Tableau(J) = Ligne_Tampon

i = i + 1

J = J - 1

End If

Loop Until i > J



If Debut < J Then

TriRapide Debut, J, Tableau

End If

If i < Fin Then

TriRapide i, Fin, Tableau

End If



End Sub

Daniel
Messages postés
31
Date d'inscription
dimanche 1 janvier 2006
Statut
Membre
Dernière intervention
5 mars 2007

merci, pour votre aide, mais encore le probléme est de remplacer a procédure Tri rapide par autres instructions (j'aime pas l'utiliser sous forme d'une procédure ) parceque j'ai pas encore attaqué les fonctions et les procédures, j'ai essayé avec ces instructions :

Private sub Command1_Click( )
' partionner le tableau selon un pivot
pivot = t(0)
PosPivot = 0
for i = lbound(t)+1 to Ubound(t)
if t(i) < pivot then
PosPivot = PosPivot +1
tmp = t(i)
t(PosPivot) = tmp
end if
Next i
' Placer le pivot a sa place finale
tmp = t(PosPivot)
t(PosPivot) = Pivot
t(0) = tmp
' trier les 2 sous tableaux crées
içi le probléme la pluspart des prog utilisant des procédures comme suit :
TriRapide D,i-2,t

SVP est ce que quelqun peut me dire ce qu'il faut écrire dans cette dérniere partie.
Merci
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
28
pour le récurssif il faut obligatoirement une procédure.

celui ci est un peu moins rapide que le QuickSort, mais il n'est pas récursif et tu peux l'utiliser où tu veux.

il suffit d'avoir défini Nb_Element, et le Tableau() qui n'est obligé d'être variant.





Sub Tri_Shell_Metzner(ByVal Nb_Element As Long, Tableau As Variant)

Dim Ecart As Long

Dim I As Long

Dim J As Long

Dim Permut As Boolean

Dim Ligne_Tampon As Variant



Ecart = Nb_Element \ 2

Do While Ecart <> 0

For I = 1 To Nb_Element - Ecart

J = I

Permut = True

Do While J > 0 And Permut

Permut = False

If Tableau(J) > Tableau(J + Ecart) Then

Ligne_Tampon = Tableau(J)


Tableau(J) = Tableau(J + Ecart)


Tableau(J + Ecart) = Ligne_Tampon

Permut = True

J = J - Ecart

End If

Loop

Next I

Ecart = Ecart \ 2

Loop

End Sub

Daniel
Messages postés
2
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
30 juillet 2008

tres bien
bravo
felicitation