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 fusion d'un tableau


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Avril 2002
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 91
    Points : 54
    Points
    54
    Par défaut Tri par fusion d'un tableau
    Je dois faire un programme en C de tri d'un tableau d'entier par fusion mais je ne comprend comment c possible de le faire. Si quelqu'un a un exemple ou une source, ça serait sympa !

    Merci

  2. #2
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Cela doit fonctionnner :


    /* TRI DICHOTOMIQUE */

    #include "STDIO.H"

    #define COPIER(A,i,B,j) {(B)[(j)++]=(A)[(i)++] ;}
    #define TAILLE 50
    #define FICHIER "tabl.txt"

    void fusionner(int R[], int M, int S[], int N, int T[])
    {
    int i = 0, j = 0, k = 0;

    while (i<M && j<N) {

    if (R[i]<S[j])
    COPIER(R,i,T,k)
    else
    COPIER(S,j,T,k)
    }

    while (i<M) COPIER(R,i,T,k)
    while (j<N) COPIER(S,j,T,k)
    }

    void copierTableau(int A[], int i, int j, int B[])
    {
    int k=0;
    while (i<j) COPIER(A,i,B,k)
    }

    void triParFusion(int T[], int N)
    {
    int R[TAILLE], S[TAILLE];
    if (N<=1)
    return;
    copierTableau(T,0,N/2,R);
    copierTableau(T,N/2,N,S);
    triParFusion(R,N/2);
    triParFusion(S,(N-N/2));
    fusionner(R,N/2,S,(N-N/2),T);
    }


    main()
    {
    FILE *FLUX_IN, *FLUX_OUT;
    int i=0, n;
    int tab[TAILLE];

    FLUX_IN = fopen(FICHIER,"r");

    if ( FLUX_IN == NULL ) {
    printf("Impossible d'ouvrir %s", FLUX_IN);
    fgetc(stdin);
    return -1;
    }

    while( feof(FLUX_IN) == 0 ) {
    fscanf(FLUX_IN, "%d", &tab[i]);
    i++;
    }

    fclose(FLUX_IN);
    n = i;

    printf("\nAvant le tri\n");
    for(i=0; i<n; i++)
    fprintf(stdout, "%d ", tab[i]);

    triParFusion(tab, n);

    printf("\nApres le tri par fusion !\n" );
    for(i=0; i<n; i++)
    fprintf(stdout, "%d ", tab[i]);


    fgetc(stdin);
    return 0;
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Luxembourg

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 25
    Points
    25
    Par défaut Tri par fusion
    Salut,

    Voici la méthode en gros... Je n'ai malheureusement plus le code...

    Donc par exemple, tu as un tableau de n données que tu souhaiterais trier !

    1. Eclate ton tableau dans deux tableaux ou deux listes chainées (je préfère la seconde mais bon)

    2. Tu tries chaque liste (il suffit de jouer avec les pointeurs de ta liste)

    3. Tu les fusionnes (chaque liste étant triée -> pas de prob)

    Voilà, ce n'est pas dur et en plus si tu connais la récursivité, c'est plus court !

    Courage !

    Ken

  4. #4
    Membre du Club

    Inscrit en
    Mai 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 23
    Points : 48
    Points
    48
    Par défaut
    Pourqoi pas utiliser le tri rapide ? Qui est plus optimal que le trie fusion !!!

    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 echange(typetab tab,int i,int j)
    {
          composante tampon=tab[i];
          tab[i]=tab[j];
          tab[j]=tampon;
    }
     
    void trirapid(typetab tab,int G,int D)
    {
          int g,d;
          composante val;
          if(D<=G)
                return();
          val=tab[D];
          g=G-1;
          d=D; 
          do
          {
                while((tab[++g]<val));
                while((tab[--d]>val)&&(d>G));
                if(g<d)
                      echange(tab,g,d);
          }
          while(g<d);
          echange(tab,g,D)
          trirapide(tab,G,g-1);
          trirapide(tab,g+1,D);
    }
    Salut !

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Je connaissais pas le tri rapide !
    Je vais tester cela !

    @+ !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Luxembourg

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 25
    Points
    25
    Par défaut Tri rapide !!!
    REMARQUE IMPORTANTE

    Le tri rapide -> le nom est bien mais faut qd même regarder la complexité !

    Dans le pire des cas, cet algo s'exécute en O(n²) ce qui n'est pas très rapide.

    En fait c'est la complexité en moyenne qui est bonne -> O(n log2 n)...

    Voilà, bonne journée

    Ken

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

Discussions similaires

  1. Tri par fusion
    Par meoliver dans le forum Pascal
    Réponses: 8
    Dernier message: 06/02/2011, 14h09
  2. Tri par selection d'un tableau de 100 entiers
    Par Vryon dans le forum Ada
    Réponses: 5
    Dernier message: 18/10/2009, 19h00
  3. Tri par fusion
    Par marsilla02 dans le forum Pascal
    Réponses: 2
    Dernier message: 06/02/2008, 20h38
  4. Réponses: 9
    Dernier message: 12/09/2007, 13h56
  5. Tri par fusion
    Par ousunas dans le forum Langage
    Réponses: 3
    Dernier message: 25/02/2006, 03h52

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