From 991104a446c8d4623c3a6d0013e7a112e7fa0986 Mon Sep 17 00:00:00 2001 From: Lucas Schmidt <lucas.schmidt@etu.unistra.fr> Date: Fri, 7 Feb 2020 14:54:29 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20du=20compte=20des=20comparaisons=20et?= =?UTF-8?q?=20des=20=C3=A9critures=20pour=20tri=20fusion=20et=20tri=20rapi?= =?UTF-8?q?de.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ makefile | 4 +-- triFusionCompte.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++ triRapideCompte.c | 47 ++++++++++++++++++++++++++++++++ utils.c | 2 +- utils.h | 3 ++- 6 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 triFusionCompte.c create mode 100644 triRapideCompte.c diff --git a/.gitignore b/.gitignore index ad11d92..f3bb7a7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,8 @@ triFusion triInsertion triRapide +triFusionCompte +triInsertionCompte +triRapideCompte main *.gch diff --git a/makefile b/makefile index a98c276..28be82f 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,4 @@ -all: main triFusion triInsertion triRapide +all: main triFusion triInsertion triRapide triFusion triFusionCompte triRapideCompte main: main.c tris.o utils.o gcc -Wall -o $@ $^ @@ -6,5 +6,5 @@ main: main.c tris.o utils.o %.o: %.c gcc -Wall -c $^ -%: %.c +%: %.c utils.o gcc -Wall -o $@ $^ diff --git a/triFusionCompte.c b/triFusionCompte.c new file mode 100644 index 0000000..30b65d5 --- /dev/null +++ b/triFusionCompte.c @@ -0,0 +1,68 @@ +#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); +} diff --git a/triRapideCompte.c b/triRapideCompte.c new file mode 100644 index 0000000..b194e51 --- /dev/null +++ b/triRapideCompte.c @@ -0,0 +1,47 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "utils.h" + +size_t partition(long* A,size_t p,size_t r,struct compte* c){ + long pivot = A[r-1]; + size_t i = p; + for(size_t j = p;j < r-1;j++){ + if(comparer(A[j],"<=",pivot,c)/*A[j] <= pivot*/){ + permuter(A+i,A+j); + c->ecrit += 3; + i++; + } + } + permuter(A+i,A+r-1); + c->ecrit += 3; + return i; +} + +void sousTriRapide(long* A,size_t p,size_t r,struct compte* c){ + if(/*comparer(p+1,"<",r,c)*/p+1 < r){ + size_t q = partition(A,p,r,c); + sousTriRapide(A,p,q,c); + sousTriRapide(A,q+1,r,c); + } +} + +void triRapide(long* A,size_t n,struct compte* c){ + sousTriRapide(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); + triRapide(A,argc-1,&c); + printf("Tableau de sortie: "); + printTab(A,argc-1); + printf("Comparaisons: %lu\nEcritures: %lu\n",c.comp,c.ecrit); + free(A); +} diff --git a/utils.c b/utils.c index 191d118..18f136c 100644 --- a/utils.c +++ b/utils.c @@ -45,7 +45,7 @@ char comparer(long a,char* op,long b,struct compte* c){ return 0; } -void ecriture(long* a,long b,struct compte* c){ +void ecrire(long* a,long b,struct compte* c){ c->ecrit++; *a = b; } diff --git a/utils.h b/utils.h index 7bd0fc6..518c42b 100644 --- a/utils.h +++ b/utils.h @@ -1,11 +1,12 @@ #include <stdio.h> #include <stdlib.h> #include <time.h> +#include <string.h> struct compte{ size_t comp; size_t ecrit; -} +}; void copierTableau(long* dest,long* src,size_t n); -- GitLab