TRIEUR DE TABLEAU SUR PLUSIEURS COLONNES

cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009 - 17 juil. 2012 à 09:57
8Tnerolf8 Messages postés 9 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 août 2013 - 28 juil. 2012 à 10:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54441-trieur-de-tableau-sur-plusieurs-colonnes

8Tnerolf8 Messages postés 9 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 août 2013
28 juil. 2012 à 10:05
Bonjour CGSI3

Je te remercie pour les liens que tu as indiqué.
En se rendant sur http://www.dailly.info/Avant-propos, on a tout un article détaillant les différents algorithmes de tri.

Après étude de ce dernier, je tenterai d'implémenter celui qui me semble le plus judicieux pour accélérer le tri de cette classe, et ne manquerai pas de t'en informer.

Bonne journée

8Tnerolf8
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
28 juil. 2012 à 00:08
Bonsoir 8Tnerolf8,
Voici pour INFO, trouvé sur le net, un petit tableau permetant de comprendre les différences de rapidité de chaque tri,
http://www.dailly.info/Comparaisons-de-performances

les algorithmes de tri étant détaillé ici (a traduire dans notre langage)
http://www.dailly.info/-030-Algorithmes-de-Tri-
8Tnerolf8 Messages postés 9 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 août 2013
25 juil. 2012 à 19:27
Bonsoir CGSI3

- Si je n'ai pas utilisé une procédure du genre QuickSort, c'est tout simplement parce que je ne savais pas qu'elle existait.
Aurais-tu, s'il te plaît, des informations pour m'indiquer où la trouver et l'utiliser, sachant que je développe en VBA ?

- J'ai inclus deux IF dans ma procédure, une par type de tri, afin d'effectuer le bon tri de suite, à la volée.
Effectivement, ta suggestion de ne faire appel qu'à une sorte de tri et d'inverser le tableau ensuite, si besoin est, est envisageable, et, à l'occasion, j'implémenterai cette optimisation.

En te remerciant d'avoir pris la peine d'étudier ma classe d'objets, je ne manquerai pas de te tenir informé lorsque j'aurai adapté cette dernière comme tu l'as suggéré.

8Tnerolf8
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
23 juil. 2012 à 01:58
Bonsoir 8Tnerolf8,
Merci pour cette petite source, Je la lis rapidement ce soir et
je me suis surtout intéressé a ta procedure de tri

Voici 2 questions et des remarques:
- Pourquoi tu n'utilise pas une procédure de tri + rapide du genre QuickSort?
(ainsi ta source ne permettra pas de gérer de grande listes, le tri va s'éterniser)

- Une instruction IF dans une imbrication de 2 boucle FOR dois ralentir cette procedure de tri.
Pourquoi ne pas inverser ta selection a la fin du traitement selon le mode de tri voulu (trier sur le mode croissant et l'inverser si on le veux décroissant par exemple) ?

Remarque:
- 2 options de tri sont présente dans VB6 (je ne sais pas si elles le sont également en Vb.Net)
Option Compare Binary 'A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text '(A=a) < ( À=à) < (B=b) < (E=e) < (Ê=ê) < (Z=z) < (Ø=ø)

- En Vb.Net il existe Linq qui permet je pense de faire le même genre de chose, mais je n'ai pas aprofondis toutes ses possibilités.

Cordialement
CGSI3
8Tnerolf8 Messages postés 9 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 août 2013
19 juil. 2012 à 15:37
Le bug sur le tri des valeurs numériques a été levé et le code de la classe d'objet mis à jour.

Vous trouverez en conclusion la procédure de recette portant sur un tri de nombres et un autre sur un tri de dates.
8Tnerolf8 Messages postés 9 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 août 2013
18 juil. 2012 à 21:22
Bonsoir Asimengo

Effectivement, tu viens de soulever une faille dans le tri effectué dans cette classe d'objet, et je vais y remédier dès que possible.

Par contre, j'ai développé cette classe dans l'optique où les données à trier ne proviennent pas d'interrogation de bases de données, donc, lorque l'on ne peux pas utiliser de SQL ou d'enregistrement, et où on ne dispose pas d'Excel pour faire des tris.

Merci d'avoir pointé du doigt le dysfonctionnement sur le tri.
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
17 juil. 2012 à 21:23
@8Tnerolf8 : J’apprécie ton travail et il a du mérite. Par contre dans ton tri tu donnes bien 40 plus petit que 5, c'est en ce sens que je dis qu'il s'agit d'un tri sur le texte.

D'autre part, ma proposition n'est pas un algo de tri proprement dit, mais un moyen d'utiliser le tri existant et bénéficier de la puissance de tri des bases de données, probable qu'il soit plus long, mais la différence est négligeable pour des petits tableaux, en principe si le tableau est grand, on aura pas besoin de tableau mais plutot de gérer des tables, donc quelque soit l'approche c'est pas vraiment un pb
8Tnerolf8 Messages postés 9 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 août 2013
17 juil. 2012 à 19:44
Je ne suis pas d'accord lorsque tu indique que mon tri s'effectue sur des chaînes de caractères.
Si tu regardes de plus près ma classe :
14.Private TableauATrier As Variant 'Le tableau à trier
J'ai fait exprès de définir une variable de type Variant pour que le tri se fasse automatiquement en fonction du type de variable.

187. For Ligne2 = 0 To NbreLignes
188. If Ligne1 <> Ligne2 And Not IsNull(TblColonne(Ligne2)) Then
189. If SensTri = "ASC" Then190. If TblColonne(Ligne2) <TblColonne(LigneRetenue) Then LigneRetenue Ligne2
191. Else192. If TblColonne(Ligne2) >TblColonne(LigneRetenue) Then LigneRetenue Ligne2
193. End If

Comme tu peux le constater, il n'y a aucun Cast des valeurs lors du tri.

Par contre, afin d'élaborer les motif pour matcher sur des LIKE, j'ai effectivement casté en String les valeurs pour élaborer le motif.

310.For Colonne = 0 To NbreColonnes311. ConcateneLigne ConcateneLigne & IIf(Len(ValRemplacement) > 0 And Colonne ColonneCible, ValRemplacement, _
312. CStr(Nz(Tableau(Colonne, LigneCible), vbNullString)))
313.Next Colonne

Je te remercie pour tes conseils sur la gestion des erreurs, ainsi que pour la description de ton algorithme de tri.
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
17 juil. 2012 à 09:57
Ta source est intéressante, mais limitée du fait que le tri se fait uniquement sur du texte.
une amélioration serait de définir le type de données de la colonne à trier (Texte, Numérique, Date, Booléen). A toi de définir le comportement lorsque la donnée ne match pas le type, perso je ne suis pas fana des messages d'erreur systématique, mais des comportements au cas else.

Voici mon algo perso pour le même sujet.
Vu qu'il s'agit d'un tri, ce qui importe ce sont les colonnes de tri. C'est uniquement de ces colonnes dont j'ai besoin de savoir le type de données. La méthode Tri chez moi consistera à créer un recodset avec des champs Texte, sauf les colonnes de tri dont je vais typer en conséquence. Après j'appliquerai un sort et je retourne le resultat par un GetRows par exemple.
Pour avoir les choses uniformes avec GetRows, je peux obliger que le tableau soit obligatoirement de dimension 2 (colonnes, lignes) avec les index (0,0), (1,0), ..(n,0) pour indiquer le type des colonnes.
Conséquence du formatage, pas de condition à tester, on peut agrémenter la classe en ajoutant des méthode de transposition de tableau, ou même de convertion d'un tableau en 1 dimension en un tableau en (1,n)

Voila, c'est une autre vision des choses, mais ca n'enlève rien à ton beau travail.

A+
Rejoignez-nous