RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN

DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015 - 16 nov. 2005 à 18:10
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 3 sept. 2006 à 21:56
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
3 sept. 2006 à 21:56
voilà :

var
Form1: TForm1;
tab1, tab2: array of integer;

implementation

uses sorts, Math;

{$R *.dfm}


function TForm1.SGCompare(i, j: Integer): Integer;
var
N1, N2: Integer;
begin
N1 := tab1[i];
N2 := tab1[j];

if N1 > N2 then
Result := -1
else if N1 < N2 then
Result := 1
else
Result := 0;
end;

procedure TForm1.SGExchange(i, j: Integer);
var
T0, T1: integer;
begin
{>> Echange des nombres }
T0 := tab1[i];
T1 := tab2[i];
tab1[i] := tab1[j];
tab2[i] := tab2[j];
tab1[j] := T0;
tab2[j] := T1;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
setlength(tab1, 10);
setlength(tab2, 10);

for i := 0 to 9 do
begin
tab1[i] := randomrange(50, 300);
tab2[i] := 2 * i + 25;
end;

with TQuickSort.Create(SGcompare, SGExchange) do
SortAndFree(0, 9);
end;
C'est tout à fait possible: tu crées les deux tableaux dynamiques de même longueur avec SetLength(). Ensuite, dans la fonction de comparaison, tu compares par rapport au premier tableau. Et dans la procédure d'échange, tu échanges à la fois tes deux tableaux.
Ou tu utilises un "array of record", qui serait plus simple.

C'est l'avantage même de ma méthode qui permet de trier peu importe la structuration des données (je fais bien ma pub, hein ?)
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
2 sept. 2006 à 16:45
Encore merci Florenth pour cette MAJ..

L'idéal, maintenant serait de pouvoir créer deux tableaux statiques de même longueur bien sûr, de lancer un tri croissant ou décroissant sur le premier et de lire le résultat de la nouvelle série nouvellement ordonnée avec une simple boucle sur le deuxième tableau.(en abandonnant le stringgrid..)

cantador
Hop ! Une autre mise à jour après six mois d'hibernation !
Voir le descriptif pour savoir ce qui a changé
Voila une mise à jour assez importante je dirais.
Voir la liste des MAJ pour plus d'infos.

Et si vous truvez une réponse au fait que ShearSort soit moins rapide que QuickSort, laissez un commentaire.

++ Flo
Sinon, pour les avides de liens, et de performances, je vous recommande ces liens (c'est en java mais on comprend facilement : http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html
et http://www.cs.rit.edu/~atk/Java/Sorting/sorting.html.

Pour plus d'infos générales sur les tris, voir ici : http://en.wikipedia.org/wiki/Sort_algorithm

Je suis particulièrement interressé par le "Shear Sort" (2ème lien) : si je peux, je posterai une inplémentation du même type que celle-ci.

Voila, tout cela pour dire que le "classique" si j'ose dire QuickSort n'est pas si quick que ça !

++
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 déc. 2005 à 20:15
pas mal du tout du tout!

j'avais tenter un pseudo-algo pour trier des nombres en PHP (rien a voir) le probleme c'est que mon algo avais un fonctionnement plus que lourdingue, en gros pour chaque nouveau chiffre present dans un tableau je rechercher le plus petit ou identique pour l'indexer.
probleme, plus il y avait de chiffre et plus la routine devenez lente de façon exponentielle (lol). en local passe encore, mais sur un serveur ce n'etait pas vraiment adapté ni acceptable donc abandon de ce truc immonde.

ton quicksort je vais me l'adapter en php car il vas bien me servir.
je pense qu'il est suffisament performant et rapide pour traiter pas mal d'entrées (aprés tout y'en a pas 150 milliard non plus ...)

AlphaSort a l'air plutot pas mal aussi, j'ai meme ete etonné de voir qu'il avait ete ecrit en TP7 sur des bon vieux 386/486 ... ça faisait longtemps et merci a Florenth de nous rapeller a quel point on a vieillis :p

je remercie tout les intervenants egalement pour les divers liens et comme l'a dit DelphiProg debat passionant et enrichissant.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
20 nov. 2005 à 11:43
Florenth, merci pour ce lien très, très intéressant. Indirectement, nous obtenons une suite à l'affirmation faite par Alain Proviste.
J'ai aussi un lien à proposer : http://fr.wikipedia.org/wiki/Algorithme_de_tri
Voir notamment le mémoire de synthèse réalisé par Nicolas HERVE.

Cette discussion est passionnante, vraiment passionnante et riche d'enseignements.
Moi je l'avais vu le smiley !!!
Mais je n'avais pas envie de poster un commentaire tout riquiqui au sujet du transtypage. ^^

Alain proviste à raison: suivant les données à traiter, il existe d'autres algo qui sont plus performants que le QuickSort: A-Sort.
Voir ici: http://perso.wanadoo.fr/ldelafosse/Sort/Papers/Asort.htm

Mais cela consomme plus de mémoire.
A voir ...
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
20 nov. 2005 à 08:40
Cirec : je suis désolé mais je n'avais pas vu le smiley.
Qui est sur les nerfs ? Je n'ai pas eu cette impression ici. Bien au contraire. Le débat est à la hauteur de la qualité du code soumis par Florenth. C'est plus un discours de passionnés que de gens énervés. Mais tu as eu raison de faire cette remarque.

Alain Proviste a écrit : "l'efficacité des tris dépend en grande partie des éléments à trier n'est-ce pas ?"
Pourrais-tu développer un peu plus, stp ?
Utilisateur anonyme
20 nov. 2005 à 01:42
Ce n'était qu'une plaisanterie voir le ;-) en bout de ligne désolé que vous l'ayez compris comme ça.
La plaisanterie devient de plus en plus dure à faire passer ici. Merci de lire jusqu'au bout de la ligne (2 fois s'il le faut) pour bien comprendre le message. Vous êtes trop sur les nerfs, décrochez un peut ça fait du bien ;-)
Il est évident que Quick Sort est le plus rapide des trois c'est sans appel.
DelphiProg > tu penses bien que j'ai fait le teste depuis longtemps (j'utilise Quick Sort depuis mes début en Turbo Pascal) et pour finir merci pour ce lien très instructif.

Stay Cool :-)

@+
Cirec
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
19 nov. 2005 à 21:47
l'efficacité des tris dépend en grande partie des éléments à trier n'est-ce pas ?

par exemple le quicksort est très efficace quand l'ecart-type est faible mais moins efficace que d'autres dans d'autres conditions ?
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
19 nov. 2005 à 21:26
Effectivmement, le tri QuickSort est surement l'un des plus rapides. Pour s'en convaincre, il suffit de lancer le projet livré avec Delphi qui met en compétition trois algorithmes dans trois threads différents. Quel est l'algo qui finit toujours bien avant les deux autres ?

Pourquoi vouloir implémenter d'autres algorithmes ici quand on sait d'avance qu'ils seront moins performants ?
Non, ton code est trop bien, n'y touche surtout pas.

Pour finir : un peu de théorie sur les algorithmes de tri ?
http://tinyurl.com/cftmb
Delphiprog > C'est vrai que en faisant cela, je détourne l'objectif principal de mon projet. C'est une idée qui m'est venue en écrivant le commentaire et je n'y avais pas trop réflechi.
Evidemment je ne vais pas le faire : pourquoi s'embetter à creer un descendant de cette classe alors qu'il est si simple d'utiliser les procedures QuickSort().

++
Merci Cirec.
En effet, le transtypage est explicitement fait par Delphi. On peut donc l'ommetre et alleger le code.

Je ne compte pas implémenter le SelectionSort et encore moins le BubbleSort. Le but de ce code est de pouvoir implémenter un algorithme de tri performant (le QuickSort, mais il en existe d'autres) aussi simplement que le classique :

var
i, j, Petit: Integer;
begin
for i := Min to Max do
begin
Petit := i;
for j := i + 1 to Max -1 do
if Array[j] < Array[Petit] then
Petit := j;
{ Invesement de Array[Petit] avec Array[i]. }
end;
end;

Cette méthode, simpliste à implémenter est bien plus longue à l'execution.
Le QuickSort est rapide mais difficile à implémenter.

Cette source présente le QuickSort avec tous ses avantages mais sans ses inconvénients !!
++
Utilisateur anonyme
19 nov. 2005 à 14:09
Bonjour

j'ai vu l'exemple SortThreads que l'on trouve dans DELPHI et ton code
et ben good job

je note 10/10
Bravo
Juste pour information tu dis :
{ CompareValue() renvoie un TValueRelationShip qui est transtypé en Integer. }
Result := Integer(CompareValue(FArray[Item1], FArray[Item2]));

je pense que le transtypage n'est pas utile vue les déclarations suivantes: (tiré de l'unité Math)
type
TValueRelationship = -1..1;

const
LessThanValue = Low(TValueRelationship);
EqualsValue = 0;
GreaterThanValue = High(TValueRelationship);

donc 3 valeurs possibles de type Integer:
le résultat de CompareValue est soit:
LessThanValue = -1
EqualsValue = 0
GreaterThanValue = 1

on peut donc remplacer:
Result := Integer(CompareValue(FArray[Item1], FArray[Item2]));
par:
Result := CompareValue(FArray[Item1], FArray[Item2]);

Comme tu as l'aire d'être bien lancé il ne reste plus qu'à implémenter
les deux autres methodes de tries (TBubbleSort, TSelectionSort) de l'exemple ;-)

@+
Cirec
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 nov. 2005 à 23:06
Pour les classes déclarées dans la partie implémentation, ce n'est possible que si elles ne sont pas appelées en dehors de cette partie. Ici c'est notamment le cas.

Tu as écrit : "4- à créer une classe qui peut être dérivée pour prendre en charge des cas spécifiques qui reviennent souvent (array of Integer par exemple)"
Je pense que ce serait une erreur car tu te détournerais de ton objectif principal et premier, et cela ferait double emploi avec une construction déjà en mesure de prendre en charge ce type de données.
Un détail, l'algorithme (avec un I, n'est ce pas) n'est evidement pas de moi.
J'ai pris ce code de l'exemple SortThreads que l'on trouve dnas (DELPHI)\Exemples\Threads\

La seule difficulté ce sont ces quelque lignes rajoutées:
{ Change l'index du "milieu" s'il est égal à Lo ou Hi. }
if Mid = Lo then
Mid := Hi
else if Mid = Hi then
Mid := Lo;

C'est pas spécialement évident à trouver ...
Mais en dehors de ça, pas de quoi couper trois pattes à un canard comme on dit !!
J'ai remarqué la faute Dr. Mais j'ai completement oublié de la modifier => j'y cours (ah zut, c'est déjà fait; merci à l'admin ^^).
Delphiprog > Merci pour tout.
En effet, je ferais mieux de déclarer les classes dans la partie implémentation. Mais au fait, je ne savais même pas qu'on pouvait le faire ! Une mise à jout s'impose.

Mais sans vouloir vanter mon code, je peux rajouter un
4 - à créer une classe qui peut être dérivée pour prendre en charge des cas spécifiques qui reviennent souvent (array of Integer par exemple).

@ ++ Flo
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 nov. 2005 à 16:34
Alors là, ça c'est du grand art. Félicitations.
Tu as réussi :
1 - l'encapsulation de l'algorithme QuickSort qui n'est pas évident à mettre en oeuvre (surtout quand on est pressé).
2 - à dissocier l'algorithme de tri des méthodes de classement et de permutation, ce qui permet une souplesse de réutilisation à l'infini
3 - à atteindre un niveau d'abstraction tel que les mêmes fonctions peuvent aussi bien traiter des chaines que des entiers ou toute autre entité pouvant faire l'objet d'un classement.

Pour toutes ces raisons, moi je dis chapeau bas.

J'aurai juste une petite suggestion : pourquoi exposer les classes TQuickSort et descendants à l'extérieur alors que ce n'est pas utile ? Tu ferais mieux de les déclarer dans la partie implémentation.

Pour toutes ces raisons, ton travail mériterait un 20/10. Mais je ne mettrai que 10/10 ;o)
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
16 nov. 2005 à 18:13
c'est contagieux... hi ! hi! : Ortographe -> Orthographe

c'est mon doigt qui n'a pas appuyé assez fort ;)
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
16 nov. 2005 à 18:10
J'ai pas encore essayé...mais pense à corriger la faute d'ortographe : ALGORYTHME -> ALGORITHME

Sinon ça devrait aller ;)
Rejoignez-nous