Tri par odre décroissant

code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006 - 10 oct. 2005 à 19:08
code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006 - 14 oct. 2005 à 01:41
Bonjour, j'ai des gros tableaux plusieurs dizaines de milliers de lignes (à plusieurs colones )que je trie par ordre croissant avec quicksort. J'aimerais faire la même chosepar ordre décroissant (de taille de fichier, qui est l'une de mes colonnes), ce sans passer un par un reclassement après quicksort . En d'autres mots, je voudrais un quicksort DECROISSANT.
Merci

19 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
10 oct. 2005 à 19:24
Ben inverse la logique du Quicksort ...

Christophe
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
10 oct. 2005 à 19:34
Quicksort ? c'est quoi ? en quel langage ? Pour moi c'est un algo.
En tous cas en vb6 ça ne peut être qu'une fonction que tu as créée toi même.
Dans ce cas, comme dit Christophe, inverse, c'est à dire remplace les '<" par des '>'.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006
10 oct. 2005 à 19:48
Quisckort , c'est le "fameux" algorythme de tri.
Bon s'il est pas dispo je vais e^tre obligé de me pastiller le test en inversant les < et le >
Merci

un des codes quicksort

Public Sub QuickSort(ByRef Arr() As Double, _
Optional ByVal lngLeft As Long = -2, _
Optional ByVal lngRight As Long = -2)


Dim i, j, lngMid As Long
Dim vntTestVal As Variant
If lngLeft -2 Then lngLeft LBound(Arr) If lngRight -2 Then lngRight UBound(Arr)


If lngLeft < lngRight Then
lngMid = (lngLeft + lngRight) \ 2
vntTestVal = Arr(lngMid)
i = lngLeft
j = lngRight
Do
Do While Arr(i) < vntTestVal
i = i + 1
Loop
Do While Arr(j) > vntTestVal
j = j - 1
Loop
If i <= j Then
Call SwapElements(Arr, i, j)
i = i + 1
j = j - 1


End If
Loop Until i > j


' Optimize sort by sorting smaller segment first
If j <= lngMid Then
Call QuickSort(Arr, lngLeft, j)
Call QuickSort(Arr, i, lngRight)
Else
Call QuickSort(Arr, i, lngRight)
Call QuickSort(Arr, lngLeft, j)
End If
End If

End Sub

Juste Do it
0
code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006
10 oct. 2005 à 19:53
Cela dit j'attends de ce site autre chose que des réponses du type Y'AKA , FOCON. Si quelqu'un à le code plutôt que des conseils. Sinon c'est un coup a y passer encore deux heures. Merci.
0

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

Posez votre question
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
10 oct. 2005 à 19:57
Attend !!! Le code tu l'as !! Il y a juste un < a remplacer par un > et un > par un < !!!
C'est tout de même pas la mer à boire, non ?

Christophe
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
10 oct. 2005 à 20:41
Et puis, de 2 choses l'une :
- ce code c'est le tien et tu devrais savoir comment inverser le tri
- tu l'as pompé et tu l'appliques sans comprendre et dans ce cas ta question aurais dù être "expliquez-moi comment ça fonctionne pour que je puisse inverser le tri".

Vu ton dernier post, tu attends du code tout fait, ouaip, pourquoi pas ? Mais bon, tu resteras toujours dépendant des autres et ça ne te fera pas progresser en prog.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006
10 oct. 2005 à 21:23
Tu me fais doucement rire. La majeure partie des programmes de ce site sont des trucs que les mecs se pompent les uns aux autres et prétendent avoir inventés. Et en fait ce n'est pas plus mal parce que c'est comme cela tout s'apprend. Sinon à quoi bon ce site ?

Deuxièment je n'ai pas déposé un source en disant "regardez ma création originale" : j'ai demandé de l'aide, sans me cacher, parce que après avoir passé une heure sur ce site à chercher (ce qui je pense est la moindre des choses avant de poser une question) et je n'ai pas trouvé.

Alors champion : à toi de jouer Quicksort qui vient d'un algorithme mathématique qui est né bien avant que la plupart des participants de ce site soit en couche culotte toi le premier (et qui a été repompé par plusieurs "inventeurs" sur code-source), est a ta disposition en version simple ci dessous : moi je ne suis pas assez bon en math pour décortiquer l'algorithme et je le reconnais. Mais pour quelqu'un de ton calibre cela ne devrait pas poser de problème. Tu trouveras mêm la version ou j'ai essayé d'inverser la logique mais sans succès.

Good luck.


Philippe







dim tableau (10) , var


tableau (1) = "sdfhgjhsg"


tableau (2) = "aaabbbb"


tableau (3) = "gggg"


tableau (4) = "BBBB"


tableau (5) = "aaaaaaaa"


tableau (6) = "0000000"


tableau (7) = "abcdef"


tableau (8) = "mmmmmmmm"


tableau (9) = "LLLLLLLLL"


CALL quicksort (tableau , 1 , 9)


var = join (tableau , chr(13))


msgbox var






'/////////////////////////////////////////////////////////////////////////////


Sub quicksort (ByRef monTABLEAU , ByVal intl , ByVal intr)


Dim IndexBAS, IndexHAUT, LigneTableauPIVOT, vartemp


IndexBAS = intl


IndexHAUT = intr


LigneTableauPIVOT = monTABLEAU((intl + intr)\2)


Do


Do While monTABLEAU(IndexBAS) < LigneTableauPIVOT


IndexBAS = IndexBAS + 1


Loop


Do While LigneTableauPIVOT < monTABLEAU(IndexHAUT)


IndexHAUT = IndexHAUT - 1


Loop


If IndexBAS <= IndexHAUT Then


vartemp = monTABLEAU(IndexHAUT)


monTABLEAU(IndexHAUT) = monTABLEAU(IndexBAS)


monTABLEAU(IndexBAS) = vartemp


IndexBAS= IndexBAS + 1


IndexHAUT = IndexHAUT - 1


End If


Loop While IndexBAS <= IndexHAUT


If intl <= IndexHAUT Then


call quicksort (monTABLEAU, intl, IndexHAUT)


End If


If IndexBAS <= intr Then


call quicksort (monTABLEAU, IndexBAS, intr)


End If


End Sub


'/////////////////////////////////////////////////////////////////////////////


Sub quicksortd (ByRef monTABLEAU , ByVal intl , ByVal intr)


Dim IndexBAS, IndexHAUT, LigneTableauPIVOT, vartemp


IndexBAS = intl


IndexHAUT = intr


LigneTableauPIVOT = monTABLEAU((intl + intr)\2)


Do


Do While monTABLEAU(IndexBAS) > LigneTableauPIVOT


IndexBAS = IndexBAS - 1


Loop


Do While LigneTableauPIVOT < monTABLEAU(IndexHAUT)


IndexHAUT = IndexHAUT + 1


Loop


If IndexBAS >= IndexHAUT Then


vartemp = monTABLEAU(IndexHAUT)


monTABLEAU(IndexHAUT) = monTABLEAU(IndexBAS)


monTABLEAU(IndexBAS) = vartemp


IndexBAS= IndexBAS - 1


IndexHAUT = IndexHAUT + 1


End If


Loop While IndexBAS >= IndexHAUT




If intl >= IndexHAUT Then


call quicksort (monTABLEAU, intl, IndexHAUT)


End If


If IndexBAS >= intr Then


call quicksort (monTABLEAU, IndexBAS, intr)


End If


End Sub


'/////////////////////////////////////////////////////////////////////////
0
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
10 oct. 2005 à 22:12
Hep on baisse d'un ton là ! Si t'es pas content de ce que t'apportent les membres de la communauté, qui sont déjà sympa d'essayer de répondre a ton message t'es pas obligé de rester.


Warning
Admin Codes-Sources.com
http://www.decompiler-vb.net/
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
10 oct. 2005 à 22:22
Tu ne devrais pas le prendre comme ça.
Tu as sans doute raison au sujet des "mecs qui se pompent les uns les autres". Et moi-même, je ne me targue pas d'avoir tout inventé de ce que j'utilise car j'ai aussi "pompé" des codes. Pourquoi vouloir réinventer la roue, la dessus tu n'as pas tord non plus.
Une toute chtite différence, perso, avant d'utiliser un code ou un algo, j'essaie de le comprendre pour éviter de faire du copier-coller bêtement et de poser des questions que je pourrais résoudre seul avec un peu de jugeote.
Maintenant, je ne suis pas un champion en prog ni en math et pourtant, sans pompage, juste par compréhension de l'algo et/ou du code voici ce que tu aurais pu trouver toi-même (en rouge les 2 tites modifs, ça tient a pas grand chose hein ? juste un demi neurone et encore) :

Sub quicksort(ByRef monTABLEAU, ByVal intl, ByVal intr)
Dim IndexBAS, IndexHAUT, LigneTableauPIVOT, vartemp
IndexBAS = intl
IndexHAUT = intr
LigneTableauPIVOT = monTABLEAU((intl + intr) \ 2)
Do
Do While monTABLEAU(IndexBAS) > LigneTableauPIVOT
IndexBAS = IndexBAS + 1
Loop
Do While LigneTableauPIVOT > monTABLEAU(IndexHAUT)
IndexHAUT = IndexHAUT - 1
Loop
If IndexBAS <= IndexHAUT Then
vartemp = monTABLEAU(IndexHAUT)
monTABLEAU(IndexHAUT) = monTABLEAU(IndexBAS)
monTABLEAU(IndexBAS) = vartemp
IndexBAS = IndexBAS + 1
IndexHAUT = IndexHAUT - 1
End If
Loop While IndexBAS <= IndexHAUT
If intl <= IndexHAUT Then
Call quicksort(monTABLEAU, intl, IndexHAUT)
End If
If IndexBAS <= intr Then
Call quicksort(monTABLEAU, IndexBAS, intr)
End If
End Sub

Bonne prog

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
10 oct. 2005 à 23:20
Tu veux du constructif, alors ok, allons-y :
Du coté de l'optimisation de ton code, a mon avis les deux derniers tests pour lancer le QSort en commencant par la plus petite partie du tableau, c'est du vent !! Cela n'optimise à mon avis en rien l'algo. Le nombre de permutation et le nombre de test sont le même. A la limite, faire ces deux tests, cela doit ralentir l'algo. LA seule différence que j'y accorde, c'est de produire un tableau qui si tu l'affiche à chaque étape de l'algo "semble" se trier plus vite au début, mais au final, c'est ex-aequo je pense.
Pour finir, dans la 1ere version de ton code, tu faisais appel à uen fonction SwapElements() pour permuter deux valeur du tableau : La aussi, perte de temps, car appel d'une fonction alors que 4 lignes font le taff (comme dans la seconde version de l'ago que tu as fourni ou que mon ami le dresseur de puce a proposé)

Et pour rebondir, sur ton billet d'humeur : Bien sur que l'on pompe tous quelque part !! Moi, le premier ! De toute façon, on y est presque toujours obligé pour progresser en prog. mais comme le dis Canis Lupus, le but n'est pas de savoir faire un copier/coller, c'est de faire du Copier/Coller/Décortiquage/Adaptation/Amelioration_Si_Possible
Pour finir, coder un QSort en VB, je n'appelle pas cela "Pomper", car le QSort n'est rien d'autre qu'un algo : Faire un QSort en VB c'est de l'implémentation, rien de plus rien de moins

Christophe
0
code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006
10 oct. 2005 à 23:24
Ca marche, Bravo, je suis impressionné.
Je t'accordes un crédit qui dépasse bien plus que le 1/2 neurones.

Je n'utilise jamais du code sans le comprendre, mais là ce truc, je bloque. Ca doit être l'âge.

Pour Admin : pas de panique , il ya juste eu de ma part un défi sur une réponse un peu courte et un commentaire pas sympa sur la réutilisation.
Pas de noms d'oiseaux, pas d'insultes on est resté dans la courtoisie... certes un peu provocatrice.

Merci à tous
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
10 oct. 2005 à 23:57
c'est marrant la remarque "Pour Admin" adressée apparemment à Warning.
A part toi Code4Free (et moi maintenant), tous tes interlocuteurs sont des admins.....

PCPT
0
code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006
11 oct. 2005 à 00:13
Bon Christophe, là tu me pousses dans mes retranchements : comme je l'ai indiqué j'ai pompé ce truc et je ne l'ai pas compris et a fortiori les lignes dont tu parles.

Maintenant je vais être obligé de le mettre à plat sinon je vais passer pour un glandu. EN outre mon module travaille sur mes 50.000 photos numériques et j'ai vraiment besoin qu'il soir performant . Je crois que je vais devoir documenter l'algo pour comprendre le code et l'optimiser.

Merci pour l'aide
Philippe
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
11 oct. 2005 à 00:38
Bah, , no problemo. Je suis OK avec Christophe et <Code4Free> a du voir que j'étais aussi admin CS.
Mais, tiens, dans la foulée, j'aimerais rajouter que, dans la série des tris de tableaux, il existe plein d'autres algos.
Le choix se fait sur la taille des tableaux qu'on veut trier.
Pour un petit tableau, le tri à bulle (ou quick sort) suffit. Pour des tableaux plus importants faut voir autre chose comme le tri par séparation (algo disponible sur google).
J'ai bien un exemple,que j'utilise, mais pas le temps de le commenter ce soir.
0
code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006
11 oct. 2005 à 00:53
Ouep c'est bien vu c'était pour warning. (c'était un peu chaud pour ma première intervention , mais je crois que j'ai compris le style).

Je suis nouveau sur le site, je ne connais pas les rôles : warning comme son nom nom l'indique semble être un modérateur. Pour Admin je ne sais pas : qui êtes vous, Messieurs, quel est votre rôle.

Philippe

ps : j'ai testé le module de maître CanisLupus (pas d'ironie, je suis son élève sur ce coup) sur un tableau numérique et ça fonctionne aussi (bien vu , puisque je travaille aussi sur les tailles de mes fichiers).
Les maîtres me répondront que c'est normal vu les valeurs ASCII, mais quand même un petit test, ca rassure.

PH
0
code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006
11 oct. 2005 à 01:02
Oui j'avais vu sur le site , dans recherche préalable, un module avec les quatre grands type de tri (dont le tri à bulle) : http://www.vbfrance.com/article.aspx?ID=8786

Mais rien sur le tri décroissant d'où ma demande.
Bon je vais me faire dormir les yeux.

Philippe
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
11 oct. 2005 à 01:41
Juste avant de me faire dormir les yeux aussi, je tiens à te dire <code4free> que les admins de codes-sources ont leur propre personnalité et expérience mais que nous oeuvrons tous dans le même sens et qu'il n'y a pas de "rôle" attitré à l'un ou à l'autre.
Bonne nuit.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
11 oct. 2005 à 22:12
Salut ! Désolé mais comme on tombe souvent sur des types qui demande des choses sans dire bonjour, sans remercier, qui prennent les membres pour des esclaves je suis un peu mefiant ! Respect est maitre mot !


Je suis moderateur certe mais mon pseudo je l'ai choisi bien avant d'être admin sur Codes-Sources ! ça a toujours été mon pseudo d'ailleurs. Donc aucun rapport avec le fait que je soit admin.

Pour qui veut la liste des modos: http://www.vbfrance.com/moderateurs.aspx.

Bonne journée & bon prog !


Warning
Admin Codes-Sources.com
http://www.decompiler-vb.net/
0
code4free Messages postés 16 Date d'inscription vendredi 9 septembre 2005 Statut Membre Dernière intervention 16 septembre 2006
14 oct. 2005 à 01:41
Ok merci (j'ai du louper la notification de ton message).

Warning c'est marrant comme pseudo. moi quand j'ai voulu choisr le mien j'ai voulu prendre JUSTEDOIT (et cela ma été refusé!! cf ci-dessous).
Bon j'ai toujours pas eu le temps de tester sans les instructions inutiles (il faut dire que la motivation n'est pas énorme puisque même sur 50000 fichiers dont la liste est chargée en tableau, il va super vite). Mais c'est promis le jour où je le fais (le test) je publie les résultats (qui dépendent de mon PC mais ca donne une idée.)
Philippe

Juste Do it
0
Rejoignez-nous