void tri_fusion(int* result, int it, int* arr, int size){ #ifdef DEBUG printf("tri_fusion(int*, %d, int*, %d)\n", it, size); #endif if(size == 1){ result[it] = arr[it]; return; } int size1 = size/2; int size2; if(size % 2 == 0){ size2 = size1; }else{ size2 = size1 + 1; } int it1 = it; int end1 = it1 + size1; int it2 = end1; int end2 = it2 + size2; tri_fusion(result, it1, arr, size1); tri_fusion(result, it2, arr, size2); for(int i = 0; i < size; ++i) arr[i + it] = result[i + it]; fusion(result, it, arr, it1, end1, it2, end2); }
void tri_fusion(int *t, int deb, int fin) { if(deb < fin) { int milieu = (deb + fin)/2; tri_fusion(t,deb,milieu); tri_fusion(t,milieu+1,fin); interclasser(t,deb,milieu,fin); } }
unsigned int tri_fusion(int *tab, int l, int r) { unsigned int cpt = 0; if (l < r) { int m = l+(r-l)/2; cpt = tri_fusion(tab, l, m); cpt += tri_fusion(tab, m+1, r); cpt += fusion(tab, l, m, r); } return cpt; }
void tri_fusion(objet *t,int d,int f) { int m; if(d<f) { m=(d+f)/2; tri_fusion(t,d,m); tri_fusion(t,m+1,f); fusion(t,d,m,f); } }
int main() { int t[N] = {10,2,4,5,6,3,1,9,7,8}; //tri_bulle(t); //tri_insertion(t); //tri_selection(t); tri_fusion(t,0,N); affiche(t); tri_rapide(t,0,N-1); affiche(t); return 0; }
unsigned int calcul_inversions_2(int *tab, unsigned int longueur) { unsigned int cpt = 0; int *tab_tmp = malloc(longueur * sizeof(int)); int i; /* On travaille avec un tableau temporaire pour ne pas trier le tableau initial */ for(i = 0 ; i < longueur ; i++) tab_tmp[i] = tab[i]; if (longueur > 0) cpt = tri_fusion(tab_tmp, 0, longueur - 1); free(tab_tmp); return cpt; }
int main(int argc, char** argv){ int size = 10; if(argc >= 2) size = atoi(argv[1]); int* arr = malloc(sizeof(int) * size); int* result = malloc(sizeof(int) * size); for(int i = 0; i < size; ++i){ scanf("%d", arr + i); } tri_fusion(result, 0, arr, size); #ifdef DEBUG for(int i = 0; i < size; ++i) printf("%d ", result[i]); #endif }