IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Tri Rapide sur un CLIST


Sujet :

MFC

  1. #1
    Membre confirm�
    Inscrit en
    Avril 2003
    Messages
    81
    D�tails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Par d�faut Tri Rapide sur un CLIST
    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

  2. #2
    Membre confirm�
    Inscrit en
    Avril 2003
    Messages
    81
    D�tails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Par d�faut
    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 ;
    }

  3. #3
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    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.

  4. #4
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    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);
    //...........

  5. #5
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    30
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 30
    Par d�faut
    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.

  6. #6
    Membre confirm�
    Inscrit en
    Avril 2003
    Messages
    81
    D�tails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Par d�faut
    Citation Envoy� par farscape
    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);
    //...........
    J'ai pens� que ceci permettrai de liberer de la memoire

  7. #7
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    tu peux toujours appeler RemoveAll( ); a la fin ...
    tu as tester pour la vitesse ?

  8. #8
    Membre confirm�
    Inscrit en
    Avril 2003
    Messages
    81
    D�tails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Par d�faut
    Citation Envoy� par farscape
    salut,
    tu peux toujours appeler RemoveAll( ); a la fin ...
    tu as tester pour la vitesse ?
    Non mais je voulais gagner de la memoire pendant le tri
    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

  9. #9
    Membre confirm�
    Inscrit en
    Avril 2003
    Messages
    81
    D�tails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Par d�faut
    Citation Envoy� par ensisoft
    Citation Envoy� par farscape
    salut,
    tu peux toujours appeler RemoveAll( ); a la fin ...
    tu as tester pour la vitesse ?
    Non mais je voulais gagner de la memoire pendant le tri
    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 resultats
    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?

  10. #10
    Invit� de passage
    Inscrit en
    Janvier 2003
    Messages
    1
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 1
    Par d�faut Une solution de tri rapide parmi tant d'autres
    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.

Discussions similaires

  1. Tri rapide sur un tableau d'entiers
    Par eldoir dans le forum Shell et commandes GNU
    R�ponses: 46
    Dernier message: 03/07/2015, 12h02
  2. Petite aide sur le tri rapide
    Par alcibiade dans le forum Algorithmes et structures de donn�es
    R�ponses: 1
    Dernier message: 11/12/2011, 23h14
  3. Question rapide sur bases de don�es
    Par ShortcutZ dans le forum MFC
    R�ponses: 3
    Dernier message: 13/09/2005, 15h27
  4. Tri rapide
    Par DBBB dans le forum Algorithmes et structures de donn�es
    R�ponses: 11
    Dernier message: 10/12/2004, 17h54
  5. R�ponses: 2
    Dernier message: 08/04/2004, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo