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 :

récupérer les indices d'un tableau après le triage


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 68
    Points : 47
    Points
    47
    Par défaut récupérer les indices d'un tableau après le triage
    bonjour;

    je viens de trié un tableau par la fonction tri_insertion .ma question est: comment faire afficher les indices du tableau trié et non pas les valeurs ?
    (c-à-dire: si j'ai le tableau: 9,4,7,1,10 le résultat doit être:3(indice de 1),1(indice de 4),2(..7),0(..9),4(..10).
    la fonction est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void tri_insertion(int tab[], int taille)
    {
       int i, j;
       for (i = 1; i < taille; ++i) {
           int elem = tab[i]; 
           for (j = i; j > 0 && tab[j-1] > elem; j--)
               tab[j] = tab[j-1];
           tab[j] = elem;
       }
    }
    cordialement

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour,

    Citation Envoyé par M77ATTAR
    je viens de trié un tableau par la fonction tri_insertion .ma question est: comment faire afficher les indices du tableau trié et non pas les valeurs ?
    Le plus efficace est de gérer les indices, à part entière, dans un tableau initialisé avec les valeurs de 0 à taille-1 par exemple, lors du tri et de leur faire subir les mêmes mouvements/échanges que les valeurs. Les rechercher à posteriori est possible (le tri par insertion est stable) mais un peu lourdingue et nécessite de (re)faire du code spécifique.

    Affichage des valeurs et indices à chaque itération, sur ton exemple :

    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
    plx@sony:~$ ./tri 9 4 7 1 10
    9-4-7-1-10
    0-1-2-3-4
    ========================
    4-9-7-1-10
    1-0-2-3-4
    ========================
    4-7-9-1-10
    1-2-0-3-4
    ========================
    1-4-7-9-10
    3-1-2-0-4
    ========================
    1-4-7-9-10
    3-1-2-0-4
    ========================
    plx@sony:~$
    détail : utiliser un compteur de boucle en dehors de "sa" boucle (antépénultième ligne - désolé, je ne dispose pas des numéros), est cochon même si, avec la plupart des compilos C (tous ?), ça fonctionne. En C99, avec la possibilité de déclarer dans la boucle for le compteur et d'alléger du coup les parties déclarations de celles des compteurs de boucles, ça ne marcherait pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc,char *argv[])
    {
        for (int i=0;i<5;i++)
            ;
     
        printf("derniere valeur pour i %d\n",i);
    }
    la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    plx@sony:~$ gcc -std=c99 -o essai essai.c
    essai.c: In function ‘main’:
    essai.c:9:42: erreur: ‘i’ undeclared (first use in this function)
    essai.c:9:42: note: each undeclared identifier is reported only once for each function it appears in
    ps: après plus de 2 ans et presque 30 messages, toujours pas trouvé le bouton code '#' ? allez, un petit effort !


    EDIT: de plus, pour le faire à posteriori, il faut disposer de la version triée et de la version initiale du tableau

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    oui effectivement, j'ai pu faire la tâche grâce à votre idée, c'est vraiment simple
    dans le cas d'un tri "ordinaire". voilà comment j'ai fait:

    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
    int *recupere_indice(int tab[],int taille)
    {
    int i,tmp,permutation=1;
    //declaration et remplissage du tableau des indices
    int  *ind=new int[taille]; 
    for (i =0; i < taille;i++) 
    {
    ind[i]=i;
    }
    while(permutation==1){
    	permutation=0;
       for (i =0; i < taille-1;i++) { 
    	   if(tab[i]>tab[i+1]){
              tmp = tab[i];  
     	      tab[i] = tab[i+1]; 
              tab[i+1] = tmp;
    // permutation des indices
    int p=ind[i];ind[i]=ind[i+1];ind[i+1]=p;
    		  permutation=1;
    	   }
       }
       }
       return ind;
    }
    merci bien !

  4. #4
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Ton code m'a l'air compliqué (en plus d'être difficile à lire).
    Tu ne veux vraiment pas utiliser la balise code (bouton #) ? C'est une question de principe ?

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    pardant ! j'ai pas bien compris votre proposition ! comme je suis débutant en c, je cherche le plus facile c'est pourquoi j'ai pris seulement l'idée [utiliser un tableau pour les indices et leur faire les mêmes échanges].

    merci encore une fois.

  6. #6
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    En ne changeant pas grand chose à ton code d'origine, je pensais tout simplement à ça (sans oublier la balise code ...) :

    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 tri_insertion(int tab[], int taille)
    // adaptation du prototype pour retourner les indices
    int *tri_insertion(int tab[], int taille)
    {
        int i, j;
     
        // allocation C (et pas C++ avec new) pour le tableau des indices
        int *indices = malloc(taille*sizeof(int));
        // initialisation de ce tableau
        for (i=0;i<taille;i++) indices[i] = i;
     
        for (i = 1; i < taille; ++i)
        {
            int elem = tab[i];
     
            for (j = i; j > 0 && tab[j-1] > elem; j--)
            {
                tab[j] = tab[j-1];
                // meme chose pour l'indice
                indices[j] = indices[j-1];
            }
            tab[j] = elem;
            // meme chose pour l'indice (i qui correspond a elem)
            indices[j] = i;
        }
     
        // je retourne les indices
        return indices;
    }

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    ok, maintenant c'est bien claire ! je vais l'utiliser.

    merci

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

Discussions similaires

  1. Trier un tableau et récupérer les indices dans l'ordre
    Par hongjan dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 14/03/2015, 16h30
  2. Réponses: 1
    Dernier message: 15/08/2011, 14h55
  3. Réponses: 5
    Dernier message: 04/03/2008, 22h22
  4. récupérer les doublons d'un tableau
    Par stoyak dans le forum Langage
    Réponses: 4
    Dernier message: 11/05/2006, 11h50
  5. [javascript] récupérer les "clés" d'un tableau
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/02/2006, 10h13

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