#include <stdio.h> #include <stdlib.h> #include "utils.h" void fusion(long* A,size_t p,size_t q,size_t r,struct compte* c){ size_t n1 = q-p; size_t n2 = r-q; long* Ag = malloc(n1*sizeof(long)); long* Ad = malloc(n2*sizeof(long)); copierTableau(Ag,A+p,n1); copierTableau(Ad,A+q,n2); c->ecrit += n1+n2; size_t indG = 0; size_t indD = 0; size_t i = p; while(comparer(i,"<",r,c)/*i < r*/){ if(comparer(indG,"==",n1,c)/*indG == n1*/){ //A[i] = Ad[indD]; ecrire(A+i,Ad[indD],c); indD++; }else if(comparer(indD,"==",n2,c)/*indD == n2*/){ //A[i] = Ag[indG]; ecrire(A+i,Ag[indG],c); indG++; }else if(comparer(Ag[indG],"<",Ad[indD],c)/*Ag[indG] < Ad[indD]*/){ //A[i] = Ag[indG]; ecrire(A+i,Ag[indG],c); indG++; }else{ //A[i] = Ad[indD]; ecrire(A+i,Ad[indD],c); indD++; } i++; } free(Ad); free(Ag); } void sousTriFusion(long* A,size_t p,size_t r,struct compte* c){ if(/*comparer(p+1,"<",r,c)*/p+1 < r){ size_t q = (p+r)/2; sousTriFusion(A,p,q,c); sousTriFusion(A,q,r,c); fusion(A,p,q,r,c); } } void triFusion(long* A,size_t n,struct compte* c){ sousTriFusion(A,0,n,c); } int main(int argc,char** argv){ long* A = malloc((argc-1)*sizeof(long)); for(size_t i = 0;i < argc-1;i++){ A[i] = atol(argv[i+1]); } struct compte c; initCompte(&c); printf("Tableau d'entrée: "); printTab(A,argc-1); triFusion(A,argc-1,&c); printf("Tableau de sortie: "); printTab(A,argc-1); printf("Comparaisons: %lu\nEcritures: %lu\n",c.comp,c.ecrit); free(A); }