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
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAB1 2
#define TAB2 (TAB1+TAB1)
typedef float tab_entiers[TAB2];
void fusionrec(tab_entiers t, tab_entiers tmp, int de1, int vers1, int de2, int vers2, int count, int posInB) {
int i;
for(i = 0 ; i < count ; i++) {
if(de2 > vers2 - 1) tmp[posInB++] = t[de1++];
else if(de1 > vers1) tmp[posInB++] = t[de2++];
else if(t[de1] < t[de2]) tmp[posInB++] = t[de1++];
else tmp[posInB++] = t[de2++];
}
}
void fusion(tab_entiers t) {
tab_entiers tmp;
int sortLength = 1, de1, de2, vers1, vers2, i;
while(sortLength < TAB2) {
de1 = 0;
while(de1 < TAB2) {
de2 = de1 + sortLength;
vers1 = de2 - 1;
vers2 = de2 + sortLength - 1;
if(vers1 >= TAB2 - 1) fusionrec(t, tmp, de1, TAB2-1, 0, 0, TAB2-de1, de1);
else if (vers2 >= TAB2 - 1) fusionrec(t, tmp, de1, vers1, de2, TAB2, TAB2-de1, de1);
else fusionrec(t, tmp, de1, vers1, de2, vers2 + 1, 2*sortLength, de1);
de1 = vers2 + 1;
}
for(i = 0 ; i < TAB2 ; i++) t[i] = tmp[i];
sortLength *= 2;
}
}
int main(void)
{
float tab1[TAB1], tab2[TAB1], tab3[TAB1], tab4[TAB1];
int i;
printf("\n~~~~ Saisie Tableau 1 ~~~~\n\n");
for(i = 0; i < TAB1; i++)
{
printf("Essai %d: ", i + 1);
scanf("%f", &tab1[i]);
}
memcpy(tab3,tab1,TAB1*sizeof(float));
printf("\n~~~~ Saisie Tableau 2 ~~~~\n\n");
for(i = 0; i < TAB1; i++)
{
printf("Essai %d: ", i + 1);
scanf("%f", &tab2[i]);
}
memcpy(tab4,tab2,TAB1*sizeof(float));
fusion(tab4);
printf("\nTri:\n");
for (i = 0; i < TAB2; i++)
{
printf(" %.0f", tab4[i]);
}
memcpy(tab4,tab3,TAB1*sizeof(float));
printf("\n\n");
system("PAUSE");
return 0;
} |