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