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

C++ Discussion :

tri par orde croissant


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Par défaut tri par orde croissant
    Bonjour à tous,

    Je sollicite votre aide pour me coder cet exercice :

    Je dispose d'une matrice de distance (diagonale) entre des zones géographiques : matrice[i][j]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0	5	8	14
    5	0	11	20
    8	11	0	7
    14	20	7	0
    Dans un premier temps, je tire aléatoirement une zone parmi les 4. Supposant qu'on tire la zone numéro 2, on la stocke dans la première case du tableau "trisecteur" : Je souhaiterai faire un tri par distance croissante par rapport a trisecteur[0].
    Si on prend l'exemple : on va comparer la distance entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [2 et 0] = 8
    [2 et 1] = 11
    [2 et 3] = 7
    Le tableau trié sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    trisecteur[0] = 2
    trisecteur[1] = 3
    trisecteur[2] = 0
    trisecteur[3] = 1
    Merci.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    'Soir

    Tu peux utiliser std::sort avec un foncteur ou une lambda de comparaison:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::sort(begin(trisecteur), end(trisecteur), [&, x=trisecteur[0]](unsigned i1, unsigned i2) {
      return abs(matrice[2][i1] - x) < std::abs(matrice[2][i1] - x); 
    });

  3. #3
    Membre régulier
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Par défaut
    Bonjour,

    J'ai fait un essai mais ça marche pas. Pourriez-vous regarder ce qui va pas ?

    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
    30
    31
    32
    33
    34
    35
    // tri par insertion
    	int memoire; // memoire:valeur en cours de traitement
    	int compteur; // indique la partie du tableau a traiter
    	bool marqueur; // faut-il continuer les comparaisons?
    	int trisecteur[NbrSecteurs];
     
    	trisecteur[0]=rand()%NbrSecteurs; // tirer aleatoirement un secteur
     
    	for(i=1; i<NbrSecteurs; i++){
    		for(j=1; j<NbrSecteurs; j++){
    			memoire = matrice_secteurs[trisecteur[0]][j];
    			compteur = i-1;
    			do
    			{
    				marqueur = false;
    				// comparaisons et décalages vers la droite si nécessaire
    				if(matrice_secteurs[trisecteur[0]][compteur] > memoire)
    					{
    						cerr << " i " << i << " M " << matrice_secteurs[trisecteur[0]][compteur] << " memoire " << memoire << endl;
    						trisecteur[compteur+1] =  compteur;
    						compteur--;
    						marqueur = true;
    						}
    						if(compteur < 0) // on évite de dépasser les limites
    							marqueur = false;
    						}
    						while(marqueur);
    		}
    	}
    	trisecteur[compteur+1] = compteur;
    	// Affichage pour verification
     
    	for(i=0; i<NbrSecteurs; i++){
    		cerr << " i " << i << " =  " << trisecteur[i] << endl;
    	}
    Le résultat du tableau est incorrect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    i 0 =  2
    i 1 =  0
    i 2 =  1
    i 3 =  0
    i 4 =  3
    i 5 =  4
    i 6 =  5
    i 7 =  6
    i 8 =  7
    Merci et bonne journée.

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Troll : il manque l'appel à std::sort.

  5. #5
    Membre régulier
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Par défaut
    Est ce que tu peux m'expliquer plus stp ? à ma connaissance, le std::sort est utilisé pour les vecteurs ce qui n'est pas le cas pour moi.


    Citation Envoyé par Ehonn Voir le message
    Troll : il manque l'appel à std::sort.

  6. #6
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Avec plaisir (tu aurais du détailler ton souci avec std::sort dans le message d'avant)

    std::sort est générique, il fonctionne avec des itérateurs et pas uniquement ceux d'std::vector. Il se trouve que les adresses (pointeurs) se comportent comme des random access iterators (c'est le type d'itérateur requis pour cette fonction).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <algorithm>
    // ...
    std::sort(trisecteur, trisecteur + NbrSecteurs);
    Si tu as le choix, tu devrais utiliser std::vector ou std::array plutôt que les tableaux "à la C".

Discussions similaires

  1. Tri par ordre croissant
    Par KinF dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 13/12/2008, 20h19
  2. Analyse croisée : empêcher le tri par ordre croissant
    Par mouaa dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 19/02/2008, 14h08
  3. Tri par ordre croissant
    Par controle55 dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/01/2008, 21h16
  4. Problême tri par ardre croissant
    Par vince86000 dans le forum ASP
    Réponses: 2
    Dernier message: 28/04/2005, 13h10

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