Bonjour,
voila j'ai trouvé cet algorithme de tri fusion sur wikipedia mais pour des entiers.
Je l'ai testé avec un tableau d'entier, ca fonctionne.
Mais en l'adaptant à mon probleme avec un tableau de structure, ca ne fonctionne pas . Il ne me fait rien Pourquoi ?

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
void fusion(int nbsommets,Station metro[nbsommets], Station tmp_metro[nbsommets] , int de1, int vers1, int de2, int vers2, int count, int posInTmp) 
{
     int i;
     for(i = 0 ; i < count ; i++)
     {
              if (de2 > vers2)   // Si fin de la liste 2, on prend dans liste 1
              			strcpy(tmp_metro[posInTmp++].nom_station,metro[de1++].nom_station);
                      //tmp[posInTmp++] = t[de1++];
              else if (de1 > vers1)   // Idem si fin de la liste 1
              			strcpy(tmp_metro[posInTmp++].nom_station,metro[de2++].nom_station);
                      //tmp[posInTmp++] = t[de2++];
              else if (strcmp(metro[de1].nom_station,metro[de1].nom_station)<=0){//(t[de1] <= t[de2])   // Enfin, sinon, on compare
                     //printf("%s  la \n",tmp_metro[de1++].nom_station);
                     strcpy(tmp_metro[posInTmp++].nom_station,metro[de1++].nom_station);/*printf("%s\n",tmp_metro[posInTmp++].nom_station);*/}
                     // tmp[posInTmp++] = t[de1++];
              else 
              		strcpy(tmp_metro[posInTmp++].nom_station,metro[de2++].nom_station);
                      //tmp[posInTmp++] = t[de2++];
      }
}
 
// Tri de tout le tableau t par fusions successives
void trifusion(int nbsommets,Station metro[nbsommets])
{
      Station tmp_metro[nbsommets];
      int sortLength = 1, de1, de2, de3, i;
      while(sortLength < nbsommets)
      {
              de1 = 0;
              while(de1 < nbsommets)
              {
                    de2 = de1 + sortLength;
                    de3 = de2 + sortLength;
                    if(de2>nbsommets) de2 = nbsommets;
                    if(de3>nbsommets) de3 = nbsommets;
                    fusion(nbsommets,metro, tmp_metro, de1, de2-1, de2, de3-1, de3-de1, de1);
                    de1 = de3;
              }
              for(i = 0 ; i < nbsommets ; i++) strcpy(metro[i].nom_station,tmp_metro[i].nom_station);//t[i] = tmp[i];
              sortLength *= 2;
       }
}