Trier (avec quicksort ) et afficher tous les tableaux et plus encore

Soyez le premier à donner votre avis sur cette source.

Vue 9 366 fois - Téléchargée 943 fois

Description

Voici une Procédure (ArrayQuickSort) et une Fonction (WriteArray) qui permettent dans l'ordre
1 de trier un tableau où un Memo
2 d'afficher le tableau dans un Label, Memo où tout autre composant acceptant du texte

l'astuce réside dans la déclaration d'une variable sans type (Var aArray)

le prototype de la Procedure ArrayQuickSort se présente comme ceci

Procedure ArrayQuickSort(Var aArray; Const Size, Kind: Integer; Const Dynamique: Boolean = False);

le prototype de la Fonction WriteArray se présente comme ceci

Function WriteArray(Const aArray; Size: Integer; Kind: TVarType; FromIndex, ToIndex: Integer; Const Dynamique: Boolean = False): String; Overload;
Function WriteArray(Const aArray; Size: Integer; Kind: TVarType; Const Dynamique: Boolean = False): String; Overload;

Ex:
Var IntArray : Array[0..10] of Integer;
DynIntArray : Array of Integer;

Pour trier:
ArrayQuickSort(IntArray, Length(IntArray), vtInteger);
ArrayQuickSort(DynIntArray, Length(DynIntArray), vtInteger, True);// si c'est un tableau dynamique on ajoute True

Pour écrire:
WriteArray(IntArray, Length(IntArray), vtInteger);

WriteArray(IntArray, Length(IntArray), vtInteger,5 , 10);// pour limiter l'affichage du 5ème au 10 ème

WriteArray(DynIntArray, Length(DynIntArray), vtInteger, True);

WriteArray(DynIntArray, Length(DynIntArray), vtInteger,5 , 10, True);


Les types de tableaux les plus courants sont déclarés toutes fois si il vous en manquait un vous pouvez le rajouter

pour le reste voir la source
Si vous avez des idées remarques suggestions où buggs dites le moi

Conclusion :


une partie du code provient de Florenth voir ici pour l'original:
http://www.delphifr.com/code.aspx?ID=34509

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
Hahem, je vais peut-être dire une bêtise, mais il est aussi possible de déclarer ça:

TCompareProc=function(Index1,Index2:Integer):Boolean;
TExchangeProc=procedure(Index1,Index2:Integer);

Dans ces conditions, on peut imaginer une déclaration de QuickSort ainsi:

procedure QuickSort(IsInferior:TCompareProc;Exchange:TExchangeProc;const IndexMin,IndexMan:Integer);

Avec cette déclaration, on peut trier n'importe quelle structure de donnée indexée par des entiers en fonction de n'importe quelle relation d'ordre. Après tout, la méthode du QuickSort ne demande qu'à connaître la façon de comparer les données à 2 index donnés, et à savoir les inverser dans leurs "cases" respectives pour fonctionner...
Alors pour l'algo ASort, (voir lien sur ma source) est spécifique au type à trier.
Il n'est donc pas possible d'en creer une version "universelle".

Ex: pour les strings, il les classe suivant leur premioère lettre dna sun tableau du genre ['A'..'Z'] et il reclasse chaque case du tableau (qui est en fait un sous tableau) en fonction de la deuxième lettre cette fois. Et ainsi de suite pour toutes les lettres. (en gros, je simplifie drolement là ...)
Ensuite, il replace les strings dans leur tableau d'origine et voila ! On voit ici que la méthode consomme bien plus de mémoire mais peut se révéler plus efficace.

A voir ...

Mais telle que j'ai implémenté la classe TSort, il est impossible de concevoir ce genre de tri; l faudrait la modifier.

++
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
34
oui completement d'accord avec Florenth ... ce serait tout aussi lourd.

et avec cirec, oui j'ai pensé en effet au TBaseArray ou TCustomArray de MxArrays ...
mais cette unité n'est disponible que dans la version Entreprise de Delphi
puisqu'elle fait partie de Decision Cube (logiquement non present dans les versions PLE).

Par contre pour vous deux, qu'en est t'il de l'algo ASort ?
je suis etonné que vous n'ayez pas encore rien sortis sur cette methode. (pas le temps ?)
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
Absolument, entièrement d'accord avec toi florenth.
Soit la tienne où la mienne alors faite votre choix...
où alors encore utiliser à la place d'un array normal un TCustomArray de l'unité MxArrays qui lui intègre le trie mais bon tout ça c'est affaire de goût, de préférence personnel et autres que l'on peut pas cités ici ^_^

@+
Cirec
Hem, utiliser les méthodes du TList sont evidemment une façon très bonne et très efficace.
Ou un TObjectList.

Mais non, le résultat ne sera pas basé sur la valeur hexa de l'adresse mémoire (heureusement) car tu fournis une méthode de comparaison.

Trie la liste, en employant l'algorithme Tri Rapide (QuickSort) et en utilisant Compare comme fonction de comparaison.

Aide de Delphi sur TList.Sort :

type TListSortCompare = function (Item1, Item2: Pointer): Integer;
procedure Sort(Compare: TListSortCompare);

Description

La méthode Sort permet de trier les éléments du tableau Items. Compare est une fonction de comparaison indiquant comment les éléments sont ordonnés. Compare renvoie < 0 si Item1 est inférieur à Item2, 0 s'ils sont égaux et > 0 si Item1 est supérieur à Item2.
____________________

C'est donc une méthode efficace. Mais si tu as un array[0..25] of string, tu ne vas pas t'amuser à remplir un TList avec les éléments du tableau pour pouvoir utiliser la métrhode Sort et ensuite tout remetre dans le tableau (avec toutes les manipulaitons de pointeurs que ça implique).
C'est pour cela qu'il vauts mieux utiliser des méthodes "universelles" telle que la mienne ou celle de Cirec. Après, quand au choix entre ces deux méthodes, j'ai promis de ne plus rien dire; fais ton choix.

++
Afficher les 21 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.