Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TRIER (AVEC QUICKSORT ) ET AFFICHER TOUS LES TABLEAUX ET PLUS ENCORE


Information sur la source

Catégorie :Divers Classé sous : trier, quicksort, afficher Niveau : Débutant Date de création : 14/12/2005 Date de mise à jour : 14/12/2005 23:45:31 Vu / téléchargé: 5 860 / 680

Note :
8,67 / 10 - par 3 personnes
8,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
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);
   où
   WriteArray(IntArray, Length(IntArray), vtInteger,5 , 10);// pour limiter l'affichage du 5ème au 10 ème

   WriteArray(DynIntArray, Length(DynIntArray), vtInteger, True);
   où
   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

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

14 décembre 2005 23:45:32 :
Remplacement de la vieille astuce du xor pour l'échange des entiers par la bonne et vieille methode de la variable temporaire Merci à WhiteHippo pour l'info.

Commentaires et avis

signaler à un administrateur
Commentaire de WhiteHippo le 14/12/2005 23:12:47

Juste une question en passant Cirec : Pourquoi utilisé la vieille astuce du xor pour l'échange des entiers ?? Pour moi, un gain d'une variable temporaire ne vaudra jamais la lisibilité d'un code.

N.B. D'ailleurs, il ne faut pas oublier que cette astuce a ses failles. Un test simple pour s'en convaincre un appel de aIntArrayExchangeProc avec item1 égal à Item2, ce qui engendra une irrémédiable mise à zéro de la mémoire indexée.

Cordialement.

signaler à un administrateur
Commentaire de cirec le 14/12/2005 23:31:51 administrateur CS

Merci pour l'info, je vais faire le necessaire. je ne savais pas que lors d'une egalité cette methode engendrait une mise à zéro de la mémoire indexée.

Merci
@+
Cirec

signaler à un administrateur
Commentaire de cirec le 14/12/2005 23:58:59 administrateur CS

Voilà c'est fait.
Si non est ce que tu sais si il y a un moyen de déterminer le type de variable passé dans ce genre de procédure où function (Var aArray) j'ai testé plusieurs chose sans succès. Ce qui implique (dans la configuration actuelle) de vérifier la validité des paramètres passé à la procédure où function et de lui donner également le type (vtInteger par Ex). Si tu vois d'autres problèmes où améliorations à apporter sur tout n'hésite pas

@+
Cirec

signaler à un administrateur
Commentaire de WhiteHippo le 15/12/2005 12:55:10

Pour ce que tu souhaites faire, il serait logique de faire appel au type Variant et de l'étendre selon tes besoins (voir TCustomVariantType).

Cordialement.

signaler à un administrateur
Commentaire de cirec le 15/12/2005 13:09:03 administrateur CS

Déjà testé mais pas très concluant, problème d'affectation de tableau à un variant...

@+
Cirec

signaler à un administrateur
Commentaire de f0xi le 16/12/2005 14:21:44 administrateur CS

juste une question, pourquoi demander a l'utilisateur le nombre d'element des tableaux
alors que tu pourrais l'appeler directement dans la methode ...

Size := Length(Array) ou High(Array)
egalement aussi prevoir de ne pas forcement partir de 0 dans le cas ou on utilise un tableau qui ne commence pas a 0 ... Low(Array)

en plus petit point sur cela, ne serait il pas preferable d'appeler le parametre Size > Count
car il s'agit du nombre d'element et non de la "Taille" (sizeof) du tableau.
Size est assé ambigu ...
Count serait plus explicite.

Function WriteArray(Const aArray; Kind: TVarType; FromIndex,
  ToIndex: Integer; Const Dynamique: Boolean = False): String;
Var aL,aH,Count : Integer;
Begin
  Result := EmptyStr;
  aL := Low(aArray);
  aH := High(aArray)-1;
  If (ToIndex <= aL) or (ToIndex > aH) then ToIndex := aH;
  If (FromIndex < aL) Then FromIndex := aL;
  If (FromIndex > aH) Then FromIndex := aH;

  For Count := FromIndex to ToIndex do ...

ce qui permet l'utilisation de tableau [d>0..e], [d<0..e] ce qui peut etre utile quand on utilise des tableau "[-5..5] of integer" ou "[1..10] of char" par exemple.
en gros l'utilisation de tableaux (dynamique ou non) qui ne parte pas de 0

qu'en pense tu ?

signaler à un administrateur
Commentaire de cirec le 16/12/2005 16:45:49 administrateur CS

Heu l'utilisation de tableaux ne commencent pas par 0 est pris en compte regarde l'exemple fourni avec (j’ai fait exprès de déclarer des tableaux qui ne commence pas à 0), c'est justement l'intérêt de cette function peut importe la taille où commencent par 0 où 50 avec la méthode employée pour moi le premier enregistrement du tableau commence toujours à 0 et même pour Array[50..100] of Gloup lol. Ensuite Length(aArray) où High(aArray) ne fonctionne pas dans cette configuration puisque aArray est de type inconnue à cette instant il faudrait rajouter une deuxième boucle qui elle va déterminer de  quel type de tableau il est question Ex:

Case Kind of
  vtInteger : if Dynamique Then aL := Low(TDynIntArray(aArray)) Else
              aL := Low(TIntArray(aArray));
...
...
End;
Et ensuite seulement
For i := aL to ...
Alors que moi je n’ais qu’une seul boucle pour le tout ^_^

Teste, regarde, scrute la source livrée en exemple et tu comprendras le pourquoi du comment ^_^

Si non pour count à la place de size je suis entièrement d’accord avec toi
Je vais faire le nécessaire comme ça plus de doute possible.

@+
Cirec

signaler à un administrateur
Commentaire de cirec le 16/12/2005 17:08:39 administrateur CS

ce sont des type de tableaux qui sont déclarés et non des tableaux directement donc la mémoire n'est pas encore utilisée d'ailleurs si tu passes un tableau du genre array[0..10] of integer par debug tu pourras te rendre compte que le tableau TIntArray(aArray) n'a pas plus que 11 valeur et non de 0..à High(integer) ensuite tu écris une fois et une fois pour toute les functions de comparaisons et d'échanges et c'est réutilisable à volonté ce qui n'est pas le cas avec ta source après si tu préfère réécrire à chaque fois que tu en as besoin ce genre de function libre à toi.
Maintenant je comprend très bien que l'on préfère sa source à celle des autres ce qui est légitime mais je ne suis pas certain que tes arguments pèsent très lourd dans la balance ^_^
et je le répète pour les autres l'intérêt de cette source c'est qu'elle accepte tout,  tableaux, Memo, TStrings, en paramètre et si votre bonheur ne s'y trouvait pas il suffit de le déclarer une fois pour toute

Voilà amicalement

Cirec

signaler à un administrateur
Commentaire de cirec le 16/12/2005 21:04:08 administrateur CS

Alors je ne sais pas comment tu vois les choses mais ta source consomme autant de mémoire (avec un seul Tableau) que la mienne avec je ne sais plus combien mais beaucoup plus de tableaux et l'appel au trie augmente  (dans ta source) la mémoire utiliser et la mienne non
Etonnant non ? Compte tenu des déclarations que tu as faites "Mais ton code, même s'il présente l'avantage de ne pas réécrire les méthodes de tri est cependant très lourd" donc il y a comme un souci dans ce que tu dis ^-^.

La méthode que j'utilise est identique à:
Function(Var aArray : Array[0..10]of  Integer); et
Function(Var aArray : Array of Integer); à ceci près que la mienne accepte les deux type d'array et autres (Ex array of String, of Double, TMemo, TStrings ...)  
En claire il n'y a pas de re-déclaration de tableau quand le trie est exécuté comme tu le penses, le Tableau est passé en paramètre inconnu certes mais à aucun moment je ne re-déclare ce dernier pour avoir accès aux informations qu'il contient

Teste et regarde l'occupation mémoire et tu seras peut être surpris du résultat.

Si non il faudra que tu m'explique comment ta source et la mienne consomme (à peut de chose près) la même quantité de mémoire. Il y a comme un os ^_^

@+
Cirec

signaler à un administrateur
Commentaire de f0xi le 16/12/2005 22:25:22 administrateur CS

TAMPAX mes amis!

bon j'ai pas trop fait d'investigation dans vos deux sources respectives mais si il y'a une chose a relever :

declarer des types tableaux predefinis (array[0..N] of truc) c'est souvent inutile car souvent on en voudras moins ou plus ou pas du tout...
donc se basé completement sur du tableaux dynamique, meme si ces derniers necessite un traitement fastidieux (setlength et tout ça).

mais je rejoins Florenth la dessus, ce que tu est en train de faire c'est un peu comme si tu voulais declarer toute les matrices possible qu'on peu faire en delphi jusqu'a ce qu'on en ai marre... c'est bien ... mais c'est beaucoup de travail pour rien en fait...

pour la variable non typée, je retiens surtout la remarque de Florenth tout en me basant sur ma propre experience.
aArray auray (oops > aurait) pus etre meme declaré comme cela :

const aArray : array of const

ce qui permet de passer n'importe quoi comme type de tableau et meme de contenus mitigés ce qui pourrait etre au final bien plus interressant. (regarder le code de la fonction WideFormatBuf dans l'unité SysUtils pour voir comment les dev de chez borland traite un array of const > Asm c'est du costaud...)

fonction(tableaudentier ...)
fonction([1,2,3,'a','chien','chat',false] ...)

mais la heu ... impossible de trier ce bordel innomable quoique...

mais bon, utiliser que du Dyn ça supprimerais pas mal de lignes de codes et ce serait bien plus simple.
en plus, pour en revenir a Array : array of const, c'est que tu pourrais meme utiliser format directement pour sortir le tableau en string :

Function WriteArray(Const aArray : array of const; const FromIndex,ToIndex: Integer): String;
begin
  Result := Format( DupeString('%s',abs(ToIndex-FromIndex)),                           copy(aArray,FromIndex,ToIndex));
end;

(a tester)
par contre j'ai remarquer (sauf erreur d'utilisation de ma part) que le fonctionnement de ton logiciel ete un peu etrange.

exemple je rentre : 1 2 3 4 5 6 7 dans le memo je click sur créer puis trier et pouf j'ai des nouvelles valeurs ... la je change le type et pouf ... de nouvelles valeurs encore...
je crois ne pas avoir tout saisis mais il me semble que logiquement il ne devrait pas faire cela.

eclaircicement ?


signaler à un administrateur
Commentaire de cirec le 16/12/2005 22:32:14 administrateur CS

si si il doit le faire le memo est uniquement présent pour voir les tableaux avant et après le trie et non pas pour crée le dit tableau pour ce faire il y un bouton créer eh oui le bouton créer cré un tableau aussi étrange que cela puisse paraitre ^_^
donc pas de soucis c'est normal.

bon pour le reste il faut que je regarde ça de plus près

@+
Cirec

signaler à un administrateur
Commentaire de cirec le 16/12/2005 23:12:47 administrateur CS

Ce coup ci f0xi c'est toi qui est fatigué car avec

const aArray : array of const
Le premier tableau que j'essaye de lui passé il me dit type incompatible et copy(aArray,FromIndex,ToIndex) me fait également une erreur
Donc résultat je ne comprend plus je voudrais bien changer, améliorer en fonction de vos remarques mais ça ne fonctionne pas :(
Cette fois c'est moi qui demande un éclaircissement
la balle est dans votre camp ^_^
@+
Cirec

signaler à un administrateur
Commentaire de f0xi le 18/12/2005 10:01:30 administrateur CS

alors en effet, la methode que j'ai proposé est a 100% non fonctionnelle. en meme temps je l'avais carrement pas tester.

comme tu le dis florenth le Pascal est fortement typé ce qui rend l'ecriture de ce genre de methode fastidieuse et complexe. donc beaucoup de problemes a relever et beaucoup de code tester avant de trouver une solution.

signaler à un administrateur
Commentaire de f0xi le 19/12/2005 04:05:14 administrateur CS

en fait je viens de me poser une question ...

pourquoi ne pas simplement utiliser une TList et jouer avec sa procedure .SORT (quicksort) ... ?

ce serait plus rapide et de plus vus que c'est une liste de pointeurs elle accepteras n'importe quel types ...
ah oui mais problemes, c'est le resultat du tris qui serat basé sur la valeur hexa et non sur la valeur du type...

qu'en pensez vous tout les deux ?

signaler à un administrateur
Commentaire de cirec le 19/12/2005 11:39:54 administrateur CS

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

signaler à un administrateur
Commentaire de f0xi le 19/12/2005 12:49:26 administrateur CS

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 ?)

signaler à un administrateur
Commentaire de Forman le 21/11/2006 15:06:03

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...

signaler à un administrateur
Commentaire de Forman le 21/11/2006 17:49:49

Oups je n'avais pas tout lu

J'avais aussi posté cette méthode ici:
http://www.delphifr.com/codes/BINARISATION-IMAGES_39294.aspx
(voir dans le fichier SortUtils.pas)

Si j'avais vu le tien avant, j'aurais gagné un peu de temps...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Trier une table [ par Frank19 ] Ma table est un paradox tout simplejla fait afficher dans un grid mais jaimerais la trier selon la colonne clické ... jme suis fait des indexes mais y afficher une page à la fermeture d'une application [ par monopoliy ] Comment faire pour afficher une page qui demande si l'on veut enregistrer ou pas les modification, quand on ferme une application. Merci. trier les données d'un 'F1Book' Active X [ par sarnaud ] J'ai un composant F1 Book active X qui ´comprends des données numériques issues d'un tableau Excel: l ligne et l colonnes. Je cherche á trier les lign Rave 5 et Delphi [ par stailer ] Salut,Quequ'un saurait-il comment afficher un rapport fait avec Rave basé sur une donnée d'une fiche ?Par exemple, sur ma fiche j'ai un Tedit dans leq afficher le nombre de ligne d'une DBGRID [ par chriszz ] Salut, je voudrais savoir comment dans un premier temps, compter le nombre de ligne de ma DBGRID (connaitre combien j'ai d'entrées) et secundo, affich Comment Afficher Le Texte D'Un WebBrowser Dans Un Memo ? [ par BenXbox ] Salut à Tous !!! Comment Je Peux Afficher Le Texte D'Un WebBrowser Dans Un Memo ? TIdHTTP et TThread [ par zmc ] Bien le bonjour,en fait j'ai commencé la création d'un petit gestionnaire de telechargement. Avec le composant TIdHTTP c'est très simple, sauf que j'a CreateDesktop,SwitchDesktop,... [ par tsoye ] Salut à Tous!J'utilise Windows 2000 Pro et Delphi 5!J'ai réussi à créer un bureau avec CreateDesktop et à l'afficher avec SwitchDesktop; le problème e DbLookUpComboBox [ par jasam ] J'utilise dans une boite 'mot de passe' un DbLookUpComboBox pour afficher les noms des utilisateursautorisés à utiliser l'application.Je voudrais affi afficher un msg d'ereujr si mauvais type [ par kwentinn ] Re tt le monde!Est-il possible d'afficher un message d'erreur lorsque l'utilisateur entre dans une variable une valeur d'un type différent?En gros, co


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,733 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.