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

SL & STL C++ Discussion :

[STL] tri non stable


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut [STL] tri non stable
    Bonjour à tous,

    Après une petite recherche, je n'ai pas trouvé la réponse à ma question, surement peut-être parceque qu'elle est un peu étrange. Peut-être pourrez vous m'aider ? Je cherche à trier un conteneur de manière non stable, voire même la moins stable possible. Autrement dit, si j'ai les données suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {A, 0}   {B, 1}   {C, 1}   {D, 2}    {E, 2}
    je voudrais que chaque tri me donne un résultat différent, soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ABCDE  ou  ABCED  ou  ACBDE  ou  ACBED
    L'algorithme std::sort n'est pas stable, mais malheureusement il me retourne toujours les éléments ordonnées de la même manière. Et j'ai bien vu qu'il n'appréciait pas du tout un opérateur de comparaison de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool operator (const C& Left, const C& Right)
    {
       if (Left.Value == Right.Value)
          return (rand()%2)
       else
          return Left.Value < Right.Value;
    }
    Ce qui est surement formellement interdit d'ailleurs
    Du coup, existe-il une manière simple de faire ceci, plutôt que d'implémenter un algo qui permuterait les éléments égaux aléatoirement, par exemple ? J'ai tenté un std::random_shuffle avant chaque std::sort, m'a ça n'a pas l'air de modifier l'ordre final obtenu après le tri.

    Merci d'avance pour toutes vos idées !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Faut-il initialiser la graine aléatoire avant un random_shuffle, comme en C ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Après quelques tests, on dirait que l'initialisation de la graine est facultative... enfin les éléments sont bien permutés, peu importe la version de random_shuffle utilisée.

    Mais au final, celà ne changeait pas mes resultats ... jusqu'a ce que j'essaye avec un échantillon plus grand. Et là, problème résolu ! Je m'en veux un peu, j'avais apparement trop peu d'éléments dans mon tableau pour voir la "non-stabilité" de std::sort

    Du coup merci à toi, ça m'aura fait creuser un peu plus du coté de random/sort ! Voilà le code qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool Compare(const Test& Left, const Test& Right)
    {
        return Left.Value < Right.Value;
    }
     
    std::vector<Test> myList;
    // remplissage avec beaucoup de données
    std::random_shuffle(myList.begin(), myList.end());
    std::sort(myList.begin(), myList.end(), Compare);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/11/2009, 15h01
  2. enum et hashcode non stable ?
    Par pop_up75 dans le forum Langage
    Réponses: 12
    Dernier message: 30/04/2009, 18h05
  3. [AC-2003] Etat - tri non demandé appliqué par access
    Par isabelle b dans le forum IHM
    Réponses: 13
    Dernier message: 24/04/2009, 16h59
  4. tri non numérique sous excel
    Par phoque.r dans le forum Excel
    Réponses: 1
    Dernier message: 23/04/2007, 12h59
  5. Menus : fonction "tri" non disponible sur un autre PC
    Par niavlys77 dans le forum Access
    Réponses: 1
    Dernier message: 02/05/2006, 19h39

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