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
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    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
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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
    Points : 17 323
    Points
    17 323
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 30
    Points : 31
    Points
    31
    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
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu peux toujours appeler RemoveAll( ); a la fin ...
    tu as tester pour la vitesse ?

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    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
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 81
    Points : 38
    Points
    38
    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
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 1
    Points : 1
    Points
    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.
    LAURENTWILLER

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