diff --git a/.gitignore b/.gitignore index ad11d9239ebf9761b79f0aee1852bab8858c2ebf..f3bb7a7fd6d9b766aad4e5a77e59f61871be7819 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,8 @@ triFusion triInsertion triRapide +triFusionCompte +triInsertionCompte +triRapideCompte main *.gch diff --git a/makefile b/makefile index a98c276a905335584c025b32977c1ffd0b846df3..28be82fcab79984eae2c3a858182f1c74039a526 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 0000000000000000000000000000000000000000..30b65d585281d38fb99d9b5ba218d1e9b1aceb8d --- /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 0000000000000000000000000000000000000000..b194e516b1887d829bdb6e9d99236f3660d9d861 --- /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 191d118e39aaa3cd58d0143c2a63474be027b139..18f136c8e66e4073e0a7ee5a106b3746ee5ee802 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 7bd0fc670061b4154cc048b5c900d370b9419c2e..518c42b0a5c8f3d33e8bbdf02e82d41698552f7c 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);