Tri Visual Basic (par extraction, bull et insertion)

kev1806 Messages postés 5 Date d'inscription samedi 29 octobre 2011 Statut Membre Dernière intervention 1 novembre 2011 - 29 oct. 2011 à 17:37
kev1806 Messages postés 5 Date d'inscription samedi 29 octobre 2011 Statut Membre Dernière intervention 1 novembre 2011 - 1 nov. 2011 à 11:48
Bonjour à tous,

Actuellement étudiant en école d'ingénieur je dois réaliser le tri de nombre choisis préalablement (entre 3 et 15) et ce au choix entre trois methodes, par extraction, par bulle et par insertion (ces trois tri par ordre croissant et décroissant).
Je suis parvenue à réaliser l'interface qui affiche un nombre de textbox correspondant au nombres de réels à trier. Je suis uniquement parvenu à réaliser le tri croissant des nombres par bulles ce qui m'ammène a ma première question :
1)comment passer du tri croissant au décroissant (le simple changement de signe ne fonctionne pas, mes valeurs s'affichent mais pas triées
Mon code :

Dim débuttableau As Long = -1
Dim fintableau As Long = -1

If débuttableau = -1 Then
débuttableau = LBound(tableau)
End If
If fintableau = -1 Then
fintableau = UBound(tableau)
End If
k = fintableau

Do
test = 0
For i = débuttableau To k - 1
If tableau(i) > tableau(i + 1) Then
test = i
temp = tableau(i)
tableau(i) = tableau(i + 1)
tableau(i + 1) = temp
End If
Next i
k = test
Loop While test

Pour l'affichage j'affiche les différentes valeurs de i dans une msgbox (cela fonctionne)

Pour les deux autres tris je ne parviens à réaliser aucuns des tris (que ce soit croissant ou décroissant), pourriez-vous me conseiller ?
Voici mon code (inspirer des algorithme "écrit")

tri par extraction :

Dim loBound As Long = -1
Dim upBound As Long = -1

If loBound = -1 Then
loBound = LBound(tableau)
End If
If upBound = -1 Then
upBound = UBound(tableau)
End If

k = loBound
For i = 0 To k - 1
pluspetite = tableau(0)
For j = i + 1 To k
While trifini = False
If tableau(j) < tableau(pluspetite) Then
pluspetite = j
If j = k Then
trifini = True
End If
End If
End While
Next j
temp = tableau(i)
tableau(i) = tableau(pluspetite)
tableau(pluspetite) = temp
Next i

Tri par insertion :

Dim débuttableau As Long
Dim fintableau As Long


If débuttableau = -1 Then
débuttableau = LBound(tableau)
End If
If fintableau = -1 Then
fintableau = UBound(tableau)
End If

For i = 1 To fintableau
k = tableau(i)
j = i - 1
While j >= 0 And k < tableau(j)
Do
tableau(j + 1) = tableau(j)
j = j - 1
tableau(j) = k
Loop
End While
Next i

Ces codes sont écris pour un tri croissant sachant que j'ai lu sur un forum que le simple changement de signe permet de passer au tri décroissant.

Je vous remercie par avance ne serait-ce pour avoir lu tout mon problème vu sa taille

8 réponses

NHenry Messages postés 15025 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 157
29 oct. 2011 à 18:03
Bonjour,

Je ne suis pas un pro du tri.
Mais pour que ta question soit plus lisible, regardes le point 2 de ma signature.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
kev1806 Messages postés 5 Date d'inscription samedi 29 octobre 2011 Statut Membre Dernière intervention 1 novembre 2011
29 oct. 2011 à 18:25
Merci pour les conseils :

Bonjour à tous,

Actuellement étudiant en école d'ingénieur je dois réaliser le tri de nombre choisis préalablement (entre 3 et 15) et ce au choix entre trois methodes, par extraction, par bulle et par insertion (ces trois tri par ordre croissant et décroissant).
Je suis parvenue à réaliser l'interface qui affiche un nombre de textbox correspondant au nombres de réels à trier. Je suis uniquement parvenu à réaliser le tri croissant des nombres par bulles ce qui m'ammène a ma première question :
1)comment passer du tri croissant au décroissant (le simple changement de signe ne fonctionne pas, mes valeurs s'affichent mais pas triées
Mon code :

Dim débuttableau As Long = -1 
Dim fintableau As Long = -1 

If débuttableau = -1 Then 
débuttableau = LBound(tableau) 
End If 
If fintableau = -1 Then 
fintableau = UBound(tableau) 
End If 
k = fintableau 

Do 
test = 0 
For i = débuttableau To k - 1 
If tableau(i) > tableau(i + 1) Then 
test = i 
temp = tableau(i) 
tableau(i) = tableau(i + 1) 
tableau(i + 1) = temp 
End If 
Next i 
k = test 
Loop While test 


Pour l'affichage j'affiche les différentes valeurs de i dans une msgbox (cela fonctionne)

Pour les deux autres tris je ne parviens à réaliser aucuns des tris (que ce soit croissant ou décroissant), pourriez-vous me conseiller ?
Voici mon code (inspirer des algorithme "écrit")

tri par extraction :

Dim loBound As Long = -1 
Dim upBound As Long = -1 

If loBound = -1 Then 
loBound = LBound(tableau) 
End If 
If upBound = -1 Then 
upBound = UBound(tableau) 
End If 

k = loBound 
For i = 0 To k - 1 
pluspetite = tableau(0) 
For j = i + 1 To k 
While trifini = False 
If tableau(j) < tableau(pluspetite) Then 
pluspetite = j 
If j = k Then 
trifini = True 
End If 
End If 
End While 
Next j 
temp = tableau(i) 
tableau(i) = tableau(pluspetite) 
tableau(pluspetite) = temp 
Next i 


Tri par insertion :

Dim débuttableau As Long 
Dim fintableau As Long 


If débuttableau = -1 Then 
débuttableau = LBound(tableau) 
End If 
If fintableau = -1 Then 
fintableau = UBound(tableau) 
End If 

For i = 1 To fintableau 
k = tableau(i) 
j = i - 1 
While j >= 0 And k < tableau(j) 
Do 
tableau(j + 1) = tableau(j) 
j = j - 1 
tableau(j) = k 
Loop 
End While 
Next i 


Ces codes sont écris pour un tri croissant sachant que j'ai lu sur un forum que le simple changement de signe permet de passer au tri décroissant.

Je vous remercie par avance ne serait-ce pour avoir lu tout mon problème vu sa taille
0
NHenry Messages postés 15025 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 157
29 oct. 2011 à 21:58
Bonjour,

Quand je lis ce morceau de code :
Dim débuttableau As Long 
Dim fintableau As Long 

If débuttableau = -1 Then 
    débuttableau = LBound(tableau) 
End If 
If fintableau = -1 Then 
    fintableau = UBound(tableau) 
End If 

For i = 1 To fintableau 
    k = tableau(i) 
    j = i - 1 
    While j >= 0 And k < tableau(j) 
        Do 
            tableau(j + 1) = tableau(j) 
            j = j - 1 
            tableau(j) = k 
        Loop 
    End While 
Next i


Je me demande quand tu sors de la boucle Do/Loop ?

Sinon, penses à indenter ton code, il n'en sera que plus lisible et cela facilitera la lecture/correction.

Dim loBound As Long = -1 
Dim upBound As Long = -1 

If loBound = -1 Then 
    loBound = LBound(tableau) 
End If 
If upBound = -1 Then 
    upBound = UBound(tableau) 
End If 

k = loBound 
For i = 0 To k - 1 
    pluspetite = tableau(0) 
    For j = i + 1 To k 
        While trifini = False 
            If tableau(j) < tableau(pluspetite) Then 
                pluspetite = j 
                If j = k Then 
                    trifini = True 
                End If 
            End If 
        End While 
    Next j 
    temp = tableau(i) 
    tableau(i) = tableau(pluspetite) 
    tableau(pluspetite) = temp 
Next i 


Dans ta boucle
While trifini = False
Tu ne changes pas la valeur de j, donc impossible que ça sorte de la boucle.

Dim débuttableau As Long = -1 
Dim fintableau As Long = -1 

If débuttableau = -1 Then 
    débuttableau = LBound(tableau) 
End If 
If fintableau = -1 Then 
    fintableau = UBound(tableau) 
End If 
k = fintableau 

Do 
    test = 0 
    For i = débuttableau To k - 1 
        If tableau(i) > tableau(i + 1) Then 
            test = i 
            temp = tableau(i) 
            tableau(i) = tableau(i + 1) 
            tableau(i + 1) = temp 
        End If 
    Next i 
    k = test 
Loop While test 


La variable test n'est pas un booléen visiblement.
Penses aussi à activer Option Strict.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 6
31 oct. 2011 à 10:54
Bonjour,

Ecole d'inhénieur, bien, alors avec math spé et math sup tu n'y arrives pas, étonnant

C'est-à-dire que ce serait plus simple de commencer par ne gérer que le code des boucles et du tri, car si on commence par rajouter le code d'un tableau ça devient tout de suite plus embrouillé quand on n'a pas l'habitude...

Le tri bulle
le = nombre d'éléments X nombre d'éléments

Si 15 éléments :

dim e(15) as long ' éléments
dim i as long
dim j as long
dim trans as long
for i = 1 to 15
 for j = 1 to 15
  if i <> j and e(i) > e(j) then 
   ' si i > j, i (supérieur) prend la place de j (inférieur)
   ' donc j (inférieur) sera au dessus = tri croissant
   trans = e(i)
   e(i) = e(j)
   e(j) = trans
  end if 
 next j
next i


et

dim e(15) as long ' éléments
dim i as long
dim j as long
dim trans as long
for i = 1 to 15
 for j = 1 to 15
  if i <> j and e(i) < e(j) then 
   ' si i < j, i (inf) prend la place de j (sup)
   ' donc j (sup) sera au dessus = tri décroissant
   trans = e(i)
   e(i) = e(j)
   e(j) = trans
  end if 
 next j
next i


Mais on fait plus moderne depuis 1975, il suffit de prendre une listBox (sorted = true) pour avoir un tri croissant.

listbox1.items.clear
for i = 1 to 15
listbox1.items.add(e(i))
next i


Puis de prendre une autre listBox2 avec sorted = false (par défaut), et de faire :

listbox2.items.clear
for i = listbox1.items.count - 1 to 0
listbox2.items.add(listbos1.items(i))
next i


Et on a le tri décroissant...

Cordialement, Joe.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kev1806 Messages postés 5 Date d'inscription samedi 29 octobre 2011 Statut Membre Dernière intervention 1 novembre 2011
1 nov. 2011 à 10:59
Merci beaucoup pour votre aide je vous tiendrais au courant de mon avancement =)
0
kev1806 Messages postés 5 Date d'inscription samedi 29 octobre 2011 Statut Membre Dernière intervention 1 novembre 2011
1 nov. 2011 à 11:30
NHenry, pour le tri a bulle test n'est en effet pas une variable boolean mais une variable long,
j'ai fait la modification mais cela n'a rien changer pour mon tri décroissant (j'ai activer l'option trict). Pour le changement de j dans la boucle celui-ci doit être fait en plus de la boucle for ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
1 nov. 2011 à 11:41
Ce que NHenry a montré du doigt, c'est ce que tu as écrit dans ta boucle for J ! Il ne t'engage pas à modifier J ! Il appelle ton attention sur un fait !
Regarde ce que tu as écrit :
 For j i + 1 To k '>>> donc pour, tour )à tour UNE valeur de J
        While trifini False '>> donc jusqu'à ce que cette fariable soit False
            If tableau(j) < tableau(pluspetite) Then 
                pluspetite = j 
                If j k Then '>> comment peux-tu écrire cela ? J a au départ une valeur autre ===>> boucle While infinie, donc !
                    trifini = True 
                End If 
            End If 
        End While 
    Next j 




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
kev1806 Messages postés 5 Date d'inscription samedi 29 octobre 2011 Statut Membre Dernière intervention 1 novembre 2011
1 nov. 2011 à 11:48
je pense avoir compris merci
0