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