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