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 :

Trier deux tableaux et les fusionner


Sujet :

C

  1. #1
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut Trier deux tableaux et les fusionner
    bonjour a tous

    j'ai réalisé un programme qui permet de saisir , remplir et trier deux tableaux puis fissionner ces deux tableaux en gardant le trie dans un 3ème tableau .

    mon programme se fonctionne mais mon problème lorsque s'affiche le 3éme tableau du fusion je trouve qu'il n'est pas trié .

    j'ai essayé plusieurs fois pour le corriger mais toujours le même problème ,

    donc j'ai besoin de vos aide mes ami(e)s.

    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
     
    void tri(int tabl[], int n)
    {
        int c,j;
     
        for(j=0;j<n-1;j++) {
            if(tabl[j]>tabl[j+1]) {
     
                c=tabl[j];
     
                tabl[j]=tabl[j+1];
     
                tabl[j+1]=c;
            }
        }
     
    }
     
    void remplissage(int s, int tab[50], int tab1[50]){
     
        int i,j;
     
        printf("remplir le 1ere tableau \n");
        for(i=0;i<s;i++){
            scanf("%d",&tab[i]);
        }
     
     
        printf("remplir le 2eme tableau \n");
        for(j=0;j<s;j++){
            scanf("%d",&tab1[j]);
        }
     
    }
     
     
    void main(){
     
        int j=0,i=0,s=0,n,f,x;
     
        int t[50],t1[50];
     
        printf("donner la taille de 2 tableaux \n");
        scanf("%d",&n);
     
        remplissage(n,t,t1);
     
     
        tri(t,n);
     
        tri(t1,n);
     
        //affichage de trie de 1ére et 2éme tableaux;
        printf("le 1er tableau trie.\n");
        for(i=0;i<n;i++) {
            printf("%5d\n",t[i]);
        }
     
        printf("le 2eme tableau trie.\n");
        for(i=0;i<n;i++) {
            printf("%5d\n",t1[i]);
        }
     
     
        //fusion du 2 tableaux
        f=n+n;
     
        int fus[f];
     
        for(i=0;i<n;i++) {
            fus[i]=t[i];
        }
        for(i=0;i<n;i++) {
            fus[i+n]=t1[i];
        }
        tri(fus,f);
     
     
        printf("Tableau fusionne\n");
     
        for(i=0;i<f;i++) {
            printf("%5d",fus[i]);
        }
        printf("\n");
     
     
        return 0;
     
    }
    Merci

  2. #2
    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
    Ta fonction de tri n'est pas bonne: Tous les tris "naïfs" doivent utiliser deux boucles for, c'est ce qui leur donne leur complexité en O().
    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 averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Points : 342
    Points
    342
    Par défaut
    Oups! Mon message est venu avec du retard. Je le laisse quand même.
    Le problème vient de la fonction de tri. Il te faut utiliser deux boucles for au lieu d'une seule. La version correcte est donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        for (i = 0; i < n - 1; i++)
            for (j = 0; j < n - 1 - i; j++) {
                if(t[j]>t[j+1]) {
                    c=t[j];
                    t[j]=t[j+1];
                    t[j+1]=c;
                }
            }
    Il existe, comme l'a dit Medinoc, des algorithmes de tri bien meilleurs que celui-ci. Fais un tour dans les FAQs Algo et C pour plus d'informations.

  4. #4
    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
    Le tri à bulle a quand même des mérites; notamment il est stable, in-place et sans demande additionnelle de mémoire.
    Le tri par sélection et le QuickSort ne sont pas stables, et si je me souviens bien le tri fusion n'est vraiment plus rapide que s'il n'est pas in-place.
    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.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par syrine01 Voir le message
    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
    void remplissage(int s, int tab[50], int tab1[50]){
     
        int i,j;
     
        printf("remplir le 1ere tableau \n");
        for(i=0;i<s;i++){
            scanf("%d",&tab[i]);
        }
     
     
        printf("remplir le 2eme tableau \n");
        for(j=0;j<s;j++){
            scanf("%d",&tab1[j]);
        }
     
    }
    Une fonction de remplissage qui répète deux-fois les mêmes instructions ; en utilisant en plus deux variables "i" et "j" (alors qu'une seule variable suffit vu que quand "j" est utilisé, "i" ne l'est plus) !!!
    Mais surtout il ne t'est pas venu à l'esprit d'écrire une fonction de remplissage qui remplit un tableau puis de l'appeler deux fois en lui passant en paramètre le tableau à remplir ???

    Citation Envoyé par syrine01 Voir le message
    main est de type int

    Citation Envoyé par syrine01 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        //fusion du 2 tableaux
        f=n+n;
     
        int fus[f];
     
        for(i=0;i<n;i++) {
            fus[i]=t[i];
        }
        for(i=0;i<n;i++) {
            fus[i+n]=t1[i];
        }
        tri(fus,f);
    C'est pas ça une fusion. Accessoirement une seule boucle aurait suffit mais surtout c'est idiot de trier les deux tableaux si tu retrie en final le tableau fusionné. Autant remplir le tableau fusionné à partir des deux tableaux non triés. Ca te donnera le même résultat mais avec moins de travail.

    Donc sinon une fusion de deux (ou n) tableaux triés se fait de la façon suivante: tu prends un élément dans chaque tableau et tant que l'élément du tableau X est plus petit que l'élément du tableau Y tu l'écris dans le 3° et tu passes à l'élément suivant du tableau X. Quand l'inégalité bascule c'est alors l'élément du tableau Y que tu écris dans le 3° et c'est le tableau Y qui passe au suivant. Et etc etc jusqu'à ce que les deux tableaux aient été traités. Avec ça, pas besoin de retrier le 3°...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [PHP 5.0] [Tableaux] Trier deux tableaux avec array_multisort
    Par persia dans le forum Langage
    Réponses: 1
    Dernier message: 21/12/2008, 21h55
  2. [CS3] fusionner deux tableaux d'orientation différentes
    Par isa68 dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 09/08/2008, 11h18
  3. [Tableaux] Fusionner deux tableaux
    Par nicerico dans le forum Langage
    Réponses: 4
    Dernier message: 06/09/2007, 13h57
  4. [Tableaux] Fusionner deux tableaux
    Par lodan dans le forum Langage
    Réponses: 4
    Dernier message: 09/11/2006, 13h42
  5. fusionner deux tableaux triés ?
    Par sami_c dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 08/06/2006, 12h19

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