Multi-tri sur plusieurs listes [Résolu]

Signaler
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
-
Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
-
Bonsoir à tous,

Je cherche en fait à programmer le multi-tri existant sur EXCEL :

ex :

552 610 40 600
337 433 30 432
385 433 71 608
264 422 30 620
18 421 20 467
461 357 40 471
442 337 40 540
321 337 225 517
632 440 30 452
371 314 40 488
90 502 20 591
311 440 70 522
50 290 40 489
157 680 225 856
345 201 27 723
122 172 30 431
32 104 30 486

si je trie sur les 3 colonnes de droite simultanément en décroissant
cela donne :

157 680 225 856
552 610 40 600
90 502 20 591
311 440 70 522
632 440 30 452
385 433 71 608
337 433 30 432
264 422 30 620
18 421 20 467
461 357 40 471
321 337 225 517
442 337 40 540
371 314 40 488
50 290 40 489
345 201 27 723
122 172 30 431
32 104 30 486


je souhaiterais faire la même opération mais
avec des tableaux (statiques ou dynamiques)

auriez-vous une idée ?

cantador

16 réponses

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Salut,
la seule chose qui me vient en tête c'est un tri en traitant les données comme une chaine de caractères et pour l'exemple on ne tient compte que des caractères après le premier espace ...
assez facile à mettre en oeuvre


[hr]@+Cirec
[hr]
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Salut,

L'idée de Cirec est très séduisante de par sa simplicité. Ne te serait-il pas possible de formater les données pour pouvoir l'utiliser ?


Sinon, en premier lieu, utilise des tableaux dynamiques. Les opérations seront plus rapides car ça reviendra à manipuler des pointeurs.

Ensuite, il faudrait avoir quelques précisions :
- Quelle est la taille des tableaux ? Cela afin de déterminer si on utilise un tri en place ou non et si il faut se soucier de la mémoire disponible ?
- Les données possèdent-elles un minima et un maxima ? Si c'est la cas, on peut envisager de faire un tri par paquets (le plus rapide mais aussi le plus gourmand en mémoire).
- S'agira-t-il toujours de valeurs entières ? Quel est l'intervalle de définition ?
- Peut-il y avoir des tris complexes, genre colonnes croissantes et d'autres décroissantes ?
- S'agira-t-il de tableaux multidimensionnels dont les dimensions peuvent varier ?
- L'optimisation est-elle cruciale ou peut-on se contenter d'une implémentation simpliste pour éviter d'y être encore à Noël ?
- Il serait peut-être aussi intéressant de connaître la nature des données car cela pourrait permettre de s'orienter vers une certaine technique plutôt qu'une autre (Dates par exemple)...

Voilà. Ce sont les questions qui me viennent à l'esprit pour le moment...

En tout cas, ça peut être chaud... Intéressant mais chaud... Surtout si on veut faire un truc plus ou moins universel...
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
un peut comme ça quoi


par contre poster le code ici ça va être chaud ...

je dois me sauver ... on voit ça plus tard ... bien plus tard

[hr]@+Cirec
[hr]
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
« Quel homme ce Cirec, il arpente ce monde étriqué tel un colosse alors que nous, hommes de peu, piétinons entre ses immenses jambes en quête de tombes déshonnorantes... »
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
Bonsoir cirec,

humhhhh..

Oui, mais j'ai besoin de tris numériques et
non alpha-numériques..
Il y également un ordre des tris (actifs simultanément) :

la première colonne n'est pas triée.
la deuxième ------- est triée décroissante
la troisième ------ est triée ------------
la quatrième ------ est triée ------------

Tu peux voir que dans la deuxième colonne, le tri est numérique
mais c'est vrai que les nombres sont tous à 3 chiffres.

Mais c'est un cas particulier.

Il faut considérer que n'importe quel nombre
peut apparaître..

cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
Bonjour Caribensila,

Dans ce problème, rien n'est figé,
sauf qu'il s'agit bien de nombre entiers.

En tout cas, ça peut être chaud.

Oui, c'est très compliqué, d'autant qu'il faut maintenir les trois tris
en même temps..

faire ça avec des tableaux ?!

je sais faire avec deux listes, ce qui n'est déjà pas évident..
mais avec trois ?

c'est tellement chaud, que j'ai réussi à m'en sortir avec une autre
pirouette :

Je stocke mes listes dans une vue d'un TcxGrid soit
TcxGridTableView (que je cache à l'écran)
Ensuite par programmation, je déclenche mes trois tris.
Puis je relis ma première colonne de 0 à n-1.

et ça marche

c'est pas top, mais ça dépanne.

cantador
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
En reprenant l'exemple que tu donnes dans ton premier message, je procéderais ainsi :

type
  TLigne = record
    Col1,
    Col2,
    Col3,
    Col4 : Integer;
  end;

  TLignesArray : array of TLigne;


Ensuite, je coderais une fonction de tri acceptant en paramètre un TLignesArray et renvoyant un TLignesArray trié. Cette fonction ayant aussi en paramètre un Boolean Croissant/Décroissant et le champ du record TLigne servant de critère de tri.


Dans un premier temps, je remplirais ma structure TLignesArray avec les données des 4 listes.
Ensuite, j'enverrais cette structure à ma fonction de tri avec Col2 comme champ à trier.
Puis, en parcourant le TLignesArray renvoyé, j'enverrais les segments du tableau dont les champs Col2 ont tous la même valeur (la fonction Copy renvoie un segment de tableau dynamique) afin de trié les champs Col3.
Puis idem avec les segments de tableau ayant les champs Col3 identiques et Col4 à trier.


La fonction de tri peut se coder avec un QuickSort ou autre, selon les performances à atteindre.
Tu peux même coder plusieurs fonctions de tri avec des techniques différentes car les performances seront différentes selon que le tableau est déjà partiellement trié ou non.

Voilà une méthode parmi d'autres, et j'espère avoir été assez clair.
N'hésite pas à demander des précisions si nécessaire.
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
j'enverrais les segments du tableau dont les champs Col2 ont tous la même valeur

pas forcément, il faudrait prévoir un encadrement

cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
cirec a encore trouvé !

trop fort..

Bon, il faut que je teste avant de noter..

mais connaissant, le phénomène, il a déjà du tout faire..

bravo !


n'empêche..
elle était bien ma question..

Ne vous inquiétez pas, j'en ai d'autres dans ma besace..

cantador
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
le code de l'unité USorts n'est pas de moi

c'est un ancien membre qui l'a fait et ne voulant plus que son nom soit associé au code mais qui accepte toute fois de le partager ...
pour ceux qui le reconnaissent je vous demande de ne pas le nommer ... merci pour lui

sinon le code (le miens) est très basique, je l'ai fait en moins de 20mn et je l'ai laissé brut, il est limité car basé uniquement sur les données du problème et rien d'autre ... il faut donc l'adapter pour plus de flexibilité...


[hr]@+Cirec
[hr]
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
oui, je connais cette unité sorts de f..
que j'utilise abondamment.
dommage qu'il ne soit plus parmi nous celui-là..

c'est vrai que tu n'as pas mis beaucoup de temps pour faire ce code..

oui, mais il faut dire aussi que la question
était bien posée..

hé hé..

et ce code, je vais le conserver précieusement.

encore merci pour ta prestation.

@bientôt

cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
@cirec
bonjour,

j'en ai une autre..

tri

est-ce la dernière version ?

cantador
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
re,

ben j'ai l'impression que non
celle que j'ai mis dans le zip semble être plus complète et plus souple d'utilisation.


[hr]@+Cirec
[hr]
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
oui, c'est vrai.
je pense celle que tu as fournie doit être la dernière
donc > /08/2006
un gros boulot d'encapsulisation du QuickSort..
elle m'a permis d'optimiser mes sources.

@bientôt

cantador
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
pour ceux qui ont suivi le thread et ceux que ça pourrait intéresser voici une version qui permet de sélectionner les tableaux à trier et leurs ordre de tri par une sélection sur un MaskEdit.

ça reste toujours très simple d'utilisation mais offre néanmoins une plus grande flexibilité ... à vous de juger




[hr]@+Cirec
[hr]