Bonjour tout le monde
Je cherche un algorithme de tri rapide sur l'objet CList
j'utilise deja un mais �a prend beaucoup de temps
quelqu'un a une idee
Merci d'avance
Bonjour tout le monde
Je cherche un algorithme de tri rapide sur l'objet CList
j'utilise deja un mais �a prend beaucoup de temps
quelqu'un a une idee
Merci d'avance
voila ma fonctoin qui fait le tri de maListe dans maListeTemp
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 void OrdonnerListe () { POSITION pPosTemp; CElement ElementTemp; POSITION pPos = maListe.GetHeadPosition(); while (pPos) { CElement Element = maListe.GetAt(pPos); pPosTemp = maListeTemp.GetHeadPosition(); bool bSup = false; while (pPosTemp && !bSup) { ElementTemp = maListeTemp.GetAt(pPosTemp); if(Element.dtDate.IsLessThan(ElementTemp.dtDate)) bSup = true; else maListeTemp.GetNext(pPosTemp); } if (pPosTemp) maListeTemp.InsertBefore(pPosTemp, Element); else maListeTemp.AddTail(Element); maListe.RemoveHead(); pPos = maListe.GetHeadPosition(); } return ; }
En standard, tu as sort pour trier. Par contre �tant donn� que tu bosses avec une CList, je ne pense pas que �a t'aidera beaucoup. Je d�place ton sujet sur le forum VC++, merci de poster au bon endroit � l'avenir.
Mieux que SDL : d�couvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
salut,
une optimisation simple de ton code :
parcourir la liste ,plutot que de prendre le premier element et le detruire ce qui oblige un tassement de la liste a chaque fois:
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6 POSITION pPos = maListe.GetHeadPosition(); for (int i=0;i < maListe.GetCount();i++) { CElement Element = maListe.GetNext(pos); //...........![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
Bonjour.
Je ne pas bien compris votre code. (Si vous pouviez le commenter).
A votre place, je ne d�clarerais aucune variable dans une boucle.
J'ai pens� que ceci permettrai de liberer de la memoireEnvoy� par farscape
salut,
tu peux toujours appeler RemoveAll( ); a la fin ...
tu as tester pour la vitesse ?
![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
Non mais je voulais gagner de la memoire pendant le triEnvoy� par farscape
parce que la boucle de tri consomme enormement de ressources
si tu voix que cette operation est tres couteuse en temps de reponse je vais essayer d'adopter ton idee
Merci
j'ai fait le test et voici les resultatsEnvoy� par ensisoft
ma methode avec des remvehead : 50mn
ta methode avec getnext : 59mn
donc ce n'est pas �a la solution
quelqu'un a une autre id�e?![]()
Le principe consiste � parcourir du d�but jusqu'� la fin de ta liste tant que le tri est d�croissant. Si d�croissant, on permute l'�l�ment pr�c�dent et l'�lement suivant. Chaque boucle cons�cutive est d�gressive d'1 pas car � la fin de chaque boucle vous aurez obligatoirement le plus grand �l�ment � la derni�re it�ration (en d'autre terme c'�tait votre pivot).
Exemple:
Vous avez une liste de 4 chiffres que vous voulez rendre croissant: 9/8/7/6
D�part : 9/8/7/6
==== 1ere boucle de 0 � 2 ou de 0 � N-1 �l�ments ====
1�re permutation : 8/9/7/6 i=0
2�me permutation : 8/7/9/6 i=1
3�me permutation : 8/7/6/9 i=2
==== 2�me boucle de 0 � 1 ou de 0 � N-2 �l�ments ====
1�re permutation : 7/8/6/9 i=0
2�me permutation : 7/6/8/9 i=1
==== 3�me boucle de 0 � 0 ou de 0 � N-3 �l�ments ====
1�re permutation : 6/7/8/9 i=0
Pour r�sumer, vous avez ici le pire des cas avec N �l�ments, car nous avons une inversion totale. Donc dans ce cas, le maximum de boucles avec N �l�ments est N-1 boucles, le maximum de permutations est (N-1)*(N-2)*(N-3)* .... * 1 ou (N-1)!.
Une autre solution consiste � faire une r�cursivit� muni d'un pivot. Mais c'est plus compliqu�. Essayez d�j� avec �a, c'est d�j� beaucoup plus rapide.
Bien cordialement.
Partager