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 RAPIDE D'un tableau de pointeur dure!


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut TRI RAPIDE D'un tableau de pointeur dure!
    Bonsoir,

    Je rencontre des problèmes avec un tri rapide de tableau de pointeur. Pour le moment sa compile mais le programme plante. Pourquoi a votre avi ?

    PS: les variables qui manque sont des varariables globales. Avez vous besion de plus de code pour m'aider ?

    MERCI

    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
    36
    37
    38
    void tri(nb) 
    { 
       tri_bis(0,nb-1); 
    } 
     
    void tri_bis(int debut, int fin) 
    { 
       int pivot; 
     
       if (debut < fin) 
       { 
          pivot = placement_pivot(debut, fin); 
          tri_bis (debut, pivot-1); 
          tri_bis (pivot+1, fin); 
       } 
    } 
     
    int placement_pivot(int debut, int fin) 
    { 
       int compteur = debut; 
       int pivot = table[debut]; 
       int i;//indice 
     
       for (i=debut+1; i<=fin; i++) 
       { 
          if (strcmp (table[i], table[pivot]) < 0)//test de la valeur de ligne 
          { 
             pivot=i; 
             strcpy (buf, table[compteur] );//echange des indices 
             strcpy (table[compteur], table[pivot]); 
             strcpy (table[pivot], buf); 
          } 
          strcpy (buf, table[debut] );//echange des indices 
          strcpy (table[compteur], table[debut]); 
          strcpy (table[compteur], buf); 
          return(compteur); 
       } 
    }

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pierrotibus Voir le message
    Je rencontre des problèmes avec un tri rapide de tableau de pointeur. Pour le moment sa compile mais le programme plante. Pourquoi a votre avi ?
    "avis" ...

    C'est parfois instructif (éducatif) de réinventer la roue, mais si c'était dans un contexte 'industriel', j'utiliserais qsort()...
    PS: les variables qui manque sont des varariables globales. Avez vous besion de plus de code pour m'aider ?
    Des globales, quelle horreur...

    On a besoin d'un code compilable.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut j'aurais aimé
    non il s'agit d'un cadre scolaire.

    Mais je veux bien des explications sur la fonction qsort() comme le prototype et la librairie.

    :-)

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pierrotibus Voir le message
    Mais je veux bien des explications sur la fonction qsort() comme le prototype et la librairie.
    C'est une fonction de la bibliothèque standard du C. C'est donc écrit dans ton livre de C...

    Sinon : http://man.developpez.com
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par pierrotibus Voir le message
    PS: les variables qui manque sont des varariables globales. Avez vous besion de plus de code pour m'aider ?
    Pourquoi as-tu besoin de variables globales ici? C'est une pratique fortement déconseillée.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Variables globales
    c'est demandé dans l'énoncé :

    -Utiliser 2 variables globales :
    le tableau de char pour la saisie
    le tableau des identifiants
    -Utiliser l'insertion par dichotomie
    ...

    Je peux vous donner le code complet si vous voulez m'aider, j'ai un l'aire de vous soulez ? c'est parce que je suis nouvellement inscrit ?

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pierrotibus Voir le message
    c'est demandé dans l'énoncé :

    -Utiliser 2 variables globales :
    le tableau de char pour la saisie
    le tableau des identifiants
    Change d'école...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Houla.
    Dit moi,

    Il n'y aurais pas une notion d'entre-aide dans les forums... Parce que a part ce foutre de moi.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce n'est pas du foutage de gueule:
    • Emmanuel ne se fout pratiquement jamais de la gueule des gens ici,
    • Et si une école te dit d'utiliser des variables globales, alors c'est l'école qui se fout de ta gueule, pas nous.
    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.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Admettez qu'on peut dire à quelqu'un de changer de livre. C'est toujours possible. Mais on ne peut pas demander à quelqu'un de changer d'école, ce n'est pas ça qui va l'aider. Mais calmons les choses.

    Envoie-ton code complet. On pourrait deviner ce qui manque mais on ne sait jamais une erreur peut s'y glisser. Et ca simplifie les choses pour celui qui t'aide.

    Faisons avec les variables globales mais apprends déjà qu'il faut éviter d'utiliser des variables globales.

    Sinon, active les warnings, tu vas très vite te rendre compte que quelque chose cloche dans les types de tes variables (à priori pivot).

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par pierrotibus Voir le message
    Dit moi,

    Il n'y aurais pas une notion d'entre-aide dans les forums... Parce que a part ce foutre de moi.
    On ne se fout pas de toi. L'utilisation de variables globales est une des pires choses que l'on puisse apprendre à un débutant. Si de telles variables doivent être utilisées, il faut être en mesure de justifier ce choix.

    C'est une grosse faute, de la part d'une école, que de proposer une consigne comme celle que tu as publié plus haut. Mais ça, tu n'y es pour rien.

    Afin de pouvoir d'aider efficacement et de voir pourquoi le programme plante, il faudrait que tu nous fournisse un exemple de code qu'on puisse compiler.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #12
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Sans chercher bien loin, il me semble qu'il y a au moins un problème dans l'algorithme utilisé pour le pivot:

    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
    int placement_pivot(int debut, int fin) 
    { 
       int compteur = debut; 
       int pivot = table[debut]; 
       int i;//indice 
     
       for (i=debut+1; i<=fin; i++) 
       { 
          if (strcmp (table[i], table[pivot]) < 0)//test de la valeur de ligne 
          { 
             pivot=i; 
             strcpy (buf, table[compteur] );//echange des indices 
             strcpy (table[compteur], table[pivot]); 
             strcpy (table[pivot], buf); 
          } 
          strcpy (buf, table[debut] );//echange des indices 
          strcpy (table[compteur], table[debut]); 
          strcpy (table[compteur], buf); 
          return(compteur); 
       } 
    }
    Tel qu'est placé le return, la boucle for n'a pas vraiment d'utilité étant donné qu'elle ne sera exécutée qu'une seule fois dans tous les cas, voire pas du tout si la condition est fausse et à ce moment-là, la fonction définie comme retournant un int ne retourne rien.

  13. #13
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Autre remarque toujours dans le placement du pivot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strcpy (buf, table[debut] );//echange des indices 
    strcpy (table[compteur], table[debut]); 
    strcpy (table[compteur], buf);
    On copie table[debut] dans buf et dans table[compteur], puis buf dans table[compteur]... 2 fois la même chose, n'y aurait-il pas un problème d'indices?

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Code complilable
    Je crois n'avoir rien oublié (j'ai plusieurs fichiers)

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 9
    char buf[21];//variable temporaire de l'identifiant
    char *table[10]; //tableau d'identifiant de l'indentifiant.
     
    void affichemenu();
    void recherche(int);
    void affichage(int);
    void doublon(int);
    void tri(int);
    void tri_bis(int, int);
    int placement_pivot(int, int);
     
     
    int main(int argc, char *argv[])
    {
        char choixMenu="";
        int cont=0;//controle de saisi
        int tailleid=0; //taille de l'identifiant.
        int i=0;//compteur de saisi.
        int j=0;//compteur
        int find=1;//paramètre de la recherch
     
        printf("***************************************\nBienvenue dans le programme Identifiant\n***************************************\n\n");
     
        do
        {
            affichemenu();
            scanf("%s",&choixMenu);
            printf("\n\n");
            switch (choixMenu)
            {
                case 49: //valeur ascii du chiffre 1
                    printf("Veuillez entrer votre identifiant :\n\n");
                    if (i <= N)
                    {
                        scanf("%s", buf);//saisie de l'identifiant
                        for (j=0; j<=i-1 ; j++)
                        {
                            find = strcmp(table[j],buf);//test si il s'agi de la meme chaine
                            if (find == 0)
                            {
                                printf("\nL'identifiant existe deja\n\n",j+1);
                                break;//sorti de la boucle for
                            }
                        }
                        if (find != 0)
                        {
                            printf("\n\n");
                            tailleid = strlen(buf);//taille de l'identifiant
                            table[i] = (char*) malloc(tailleid);//attribut le nombre d'octets au pointeur dans table de i
                            strcpy (table[i], buf);
                            buf[0]=0 ;
                            i++;
                            {
                            tri(i);
                            }
                        }
                        if (tailleid > 21)//vérification de la taille
                        {
                            printf("votre identifiant est trop grand, maximum 20 caracteres\n\n");
                            i--;
                        }
                    }
                    else
                    {
                        printf("Vous avez saisi le nombre maximum d'identifiant\n\n");
                    }
                    choixMenu="";
                    break;
                case 50://valeur ASCII du chiffre 2
                    printf("Voici la liste des identifiants :\n\n");
                    affichage(i);
                    choixMenu="";
                    break;
                case 51://valeur ASCII du chiffre 3
                    printf("Veuillez entrer l'identifiant recherche :\n\n");
                    scanf("%s",buf);//chaine recherché
                    recherche(i);
                    choixMenu="";
                    break;
                case 52://valeur ASCII du chiffre 4
                    printf("A bientot\n");
                    return (0);
                default:
                    printf("vous n'avez pas entre un nombre correct ! \n\n");
                    break;
            }
     
        }while (choixMenu != 52);
    }
     
    void affichemenu()
    {
        printf("1) Entrer un identifiant\n2) Afficher la liste des identifiants\n");
        printf("3) Chercher la position d'un identifiant\n4) Sortir de l'application\n\n");
        printf("Veuillez saisir le numero de la fontion :");
     
    }
     
    void recherche(int i)
    {
        int j; //indice
        int find=1;//paramètre de recherche
        for (j=0; j<=i-1 ; j++)
        {
            find = strcmp(table[j],buf);//test si il s'agi de la meme chaine
            if (find == 0)
            {
                printf("\nl'identifiant a ete trouve en %ld position\n\n",j+1);
            }
        }
        if (find != 0)
        {
            printf("\nPas de reference pour cet identifiant\n\n");
        }
    }
     
    void affichage(int i)
    {
        int j;//indice
        for (j=0 ; j<=i-1 ; j++)//boucle parcourant les lignes de table
        {
            printf("%s\n\n", table[j]);
        }
    }
     
    void tri(nb)
    {
        tri_bis(0,nb-1);
    }
     
    void tri_bis(int debut, int fin)
    {
        int pivot;
        if (debut < fin)
        {
            pivot = placement_pivot(debut, fin);
            tri_bis (debut, pivot-1);
            tri_bis (pivot+1, fin);
        }
    }
     
    int placement_pivot(int debut, int fin)
    {
        int compteur = debut;
        int pivot = table[debut];
        int i;//indice
        for (i=debut+1; i<=fin; i++)
        {
            if (strcmp (table[i], table[pivot]) < 0)//test de la valeur de ligne
            {
                pivot=i;
                strcpy (buf, table[compteur] );//echange des indices
                strcpy (table[compteur], table[pivot]);
                strcpy (table[pivot], buf);
            }
        strcpy (buf, table[debut] );//echange des indices
        strcpy (table[debut], table[compteur]);
        strcpy (table[compteur], buf);
        return(compteur);
        }
    }

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pierrotibus Voir le message
    Je crois n'avoir rien oublié (j'ai plusieurs fichiers)
    Je te conseille de mieux régler ton compilateur

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    et de commencer par corriger tout ceci :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:8: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:19: warning: initialization makes integer from pointer without a cast
    main.c:45: warning: too many arguments for format
    main.c:71: warning: assignment makes integer from pointer without a cast
    main.c:76: warning: assignment makes integer from pointer without a cast
    main.c:82: warning: assignment makes integer from pointer without a cast
    main.c:20: warning: unused variable `cont'
    main.c: At top level:
    main.c:17: warning: unused parameter 'argc'
    main.c:17: warning: unused parameter 'argv'
    main.c: In function `main':
    main.c:93: warning: control reaches end of non-void function
    main.c: At top level:
    main.c:96: warning: function declaration isn't a prototype
    main.c: In function `recherche':
    main.c:112: warning: long int format, int arg (arg 2)
    main.c: In function `tri':
    main.c:131: warning: type of "nb" defaults to "int"
    main.c: In function `placement_pivot':
    main.c:149: warning: initialization makes integer from pointer without a cast
    main.c:165: warning: control reaches end of non-void function
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 5 seconds)
    0 errors, 15 warnings
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        int pivot = table[debut];
    Ceci n'a aucun sens car la définition de table est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* tableau d'identifiant de l'indentifiant. */
    char *table[10];
    table[debut] est donc de type char * et non int, ce qui rend la suite de l'algorithme incohérent.

    Il y a donc un problème de conception majeur.
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut ET voilà :-)
    Merci tu as trouvé ma bétise !

    int pivot = debut;

    Merci pour les conseils, je vais essayer même si je comprend pas les messages d'erreur.

    Bye

  17. #17
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Il y a un grand problème au niveau de la conception de l'algorithme implanté par la fonction placement_pivot(). Il n'est pas correct. Essaie de prendre un exemple, un papier et un crayon pour te rendre compte de ce qui cause de misère.

    Voici un exemple de ton code corrigé, avec un algorithme un peu modifié et très avare en commentaires. J'ai naturellement enlevé toutes les variables globales. Libre à toi d'adapter le code selon les contraintes qui te sont imposées et surtout... pose des questions si tu ne comprends 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define TAILLE_CHAINES 10
    #define NB_ELEMS(t) ( sizeof (t) / sizeof *(t) )
     
    static void copie_chaine(char *dest, char const *src, size_t taille_dest);
    static void echanger_chaines(char table[][TAILLE_CHAINES], int gauche, int droite);
    static void tri(char table[][TAILLE_CHAINES], size_t nelems);
    static void tri_bis(char table[][TAILLE_CHAINES], int debut, int fin);
    static int placement_pivot(char table[][TAILLE_CHAINES], int debut, int fin);
    static void afficher_tableau(char table[][TAILLE_CHAINES], size_t taille);
     
    int main(void)
    {
        char tableau[][TAILLE_CHAINES] =
        {
            "thierry",
            "evelyne",
            "zoe",
            "daniel",
            "nadine",
            "paul",
            "sylvain"
        };
     
        afficher_tableau(tableau, NB_ELEMS(tableau));
        tri(tableau, NB_ELEMS(tableau));
        afficher_tableau(tableau, NB_ELEMS(tableau));
     
        return EXIT_SUCCESS;
    }
     
    /* Copie la chaine src dans la chaine dest de maniere securisee */
    static void copie_chaine(char *dest, char const *src, size_t taille_dest)
    {
        if (dest != NULL && src != NULL && taille_dest && taille_dest > 0)
        {
            *dest = 0;
            strncat(dest, src, taille_dest - 1);
        }
    }
     
    /* Trie un tableau de nelems chaines de caracteres de longueur TAILLE_CHAINES */
    static void tri(char table[][TAILLE_CHAINES], size_t nelems)
    {
        tri_bis(table, 0, nelems - 1);
    }
     
    /* Echange les elements d'indices gauche et droite du tableau table */
    static void echanger_chaines(char table[][TAILLE_CHAINES], int gauche, int droite)
    {
        if (table != NULL && gauche != droite)
        {
            char tampon[TAILLE_CHAINES] = "";
     
            copie_chaine(tampon, table[gauche], TAILLE_CHAINES);
            copie_chaine(table[gauche], table[droite], TAILLE_CHAINES);
            copie_chaine(table[droite], tampon, TAILLE_CHAINES);
        }
    }
     
    /* Effectue le tri des caractere a l'aide de l'algorithme du tri rapide */
    static void tri_bis(char table[][TAILLE_CHAINES], int debut, int fin)
    {
        int pivot;
     
        if (debut < fin)
        {
            pivot = placement_pivot(table, debut, fin);
            tri_bis (table, debut, pivot - 1);
            tri_bis (table, pivot + 1, fin);
        }
    }
     
    /* Placement de l'element pivot utilise dans le contexte de l'algorithme du
     * tri rapide.
     */
    static int placement_pivot(char table[][TAILLE_CHAINES], int debut, int fin)
    {
        /* On choisit le premier element du tableau comme element pivot */
     
        char const *val_pivot = table[debut]; /* Valeur de l'element pivot */
        int i = debut + 1; /* Indice pour le balayage par la gauche */
        int j = fin; /* Indice pour le balayage par la droite */
     
        do
        {
            /* On recherche depuis la gauche le premier element du tableau plus
               grand que l'element pivot */
            for ( ;i <= fin && strcmp(table[i], val_pivot) < 0; i++)
            {
            }
     
            /* On recherche depuis la droite le premier element du tableau plus
               petit que l'element pivot */
            for ( ; strcmp(val_pivot, table[j]) < 0; j--)
            {
            }
     
            /* Les elements d'indices i, j du tableau echanger leur place pour se
               situer dans le bon sous-tableau par rapport à l'élément pivot */
            if (i < j)
            {
                echanger_chaines(table, i, j);
            }
        } while (i < j);
     
        /* On place l'element pivot au bon endroit */
        echanger_chaines(table, debut, j);
     
        return j;
    }
     
    /* Affiche un tableau de chaine de caracteres sur le flux de sortie standard */
    static void afficher_tableau(char table[][TAILLE_CHAINES], size_t taille)
    {
        if (table != NULL && taille > 0)
        {
            size_t i;
     
            for (i = 0; i < taille; i++)
            {
                printf("%s\n", table[i]);
            }
            printf("\n");
        }
    }
    La fonction telle que présentée ci-dessus n'est évidamment pas aussi flexible et optimisée que qsort() (déclarée dans stdlib.h).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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. Tri rapide d'un tableau
    Par lefort dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 15h24
  3. Tri de tableau par pointeurs
    Par colocolo dans le forum Pascal
    Réponses: 9
    Dernier message: 19/02/2007, 21h02
  4. tableau de pointeur+tri+coup de pouce svp
    Par php4life dans le forum C
    Réponses: 12
    Dernier message: 15/04/2006, 13h49
  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