From 84ce889c34773131feba0bde04206b18b7d14375 Mon Sep 17 00:00:00 2001 From: Lucas Schmidt <lucas.schmidt@etu.unistra.fr> Date: Fri, 31 Jan 2020 14:28:36 +0100 Subject: [PATCH] Ajout du tri fusion --- triFusion.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 triFusion.c diff --git a/triFusion.c b/triFusion.c new file mode 100644 index 0000000..0694e62 --- /dev/null +++ b/triFusion.c @@ -0,0 +1,75 @@ +#include <stdio.h> +#include <stdlib.h> + +void copierTableau(long* dest,long* src,size_t n){ + for(size_t i = 0;i < n;i++){ + dest[i] = src[i]; + } +} + +void fusion(long* A,size_t p,size_t q,size_t r){ + 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); + size_t indG = 0; + size_t indD = 0; + size_t i = p; + while(i < r){ + if(indG == n1){ + A[i] = Ad[indD]; + indD++; + }else if(indD == n2){ + A[i] = Ag[indG]; + indG++; + }else if(Ag[indG] < Ad[indD]){ + A[i] = Ag[indG]; + indG++; + }else{ + A[i] = Ad[indD]; + indD++; + } + i++; + } + free(Ad); + free(Ag); +} + +void sousTriFusion(long* A,size_t p,size_t r){ + if(p+1 < r){ + size_t q = (p+r)/2; + sousTriFusion(A,p,q); + sousTriFusion(A,q,r); + fusion(A,p,q,r); + } +} + +void triFusion(long* A,size_t n){ + sousTriFusion(A,0,n); +} + +void printTab(long* A,size_t n){ + printf("{"); + for(size_t i = 0;i < n;i++){ + if(i != 0){ + printf(","); + } + printf("%ld",A[i]); + } + printf("}\n"); +} + +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]); + } + printf("Tableau d'entrée: "); + printTab(A,argc-1); + triFusion(A,argc-1); + printf("Tableau de sortie: "); + printTab(A,argc-1); + free(A); +} -- GitLab