Probleme tri fusion chaine de caractere

G4uthier Messages postés 131 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 23 juillet 2009 - 1 juin 2009 à 00:38
G4uthier Messages postés 131 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 23 juillet 2009 - 1 juin 2009 à 11:50
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 ?

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;
       }
}

2 réponses

G4uthier Messages postés 131 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 23 juillet 2009
1 juin 2009 à 00:42
// Fusion des listes t(de1..vers1) et t(de2..vers2) dans tmp(posInTmp..posInTmp+count-1)
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;
}
}
0
G4uthier Messages postés 131 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 23 juillet 2009
1 juin 2009 à 11:50
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 ?
0
Rejoignez-nous