diff --git a/TP1/Makefile b/TP1/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..4ef68c03f7953ab2723c38e05c9466be1a6040f7
--- /dev/null
+++ b/TP1/Makefile
@@ -0,0 +1,12 @@
+all: main
+	
+main : tris.o utils.o main.c
+	gcc -o main -Wall utils.o tris.o -g main.c
+
+tris.o : tris.c tris.h
+	gcc -c -Wall -g tris.c
+
+utils.o : utils.c utils.h
+	gcc -o utils.o -c -g utils.c
+clean :
+	rm *.o
diff --git a/TP1/main b/TP1/main
new file mode 100644
index 0000000000000000000000000000000000000000..e1c2a656341bd0b46333d87f12c91f9830e88306
Binary files /dev/null and b/TP1/main differ
diff --git a/TP1/main.c b/TP1/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..f43423531e87877b39ec30b4beac96bcc55ad750
--- /dev/null
+++ b/TP1/main.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "tris.h"
+#include "utils.h"
+
+
+int main() {
+  printf("Tri Insertion: \n");
+  long* triIns = malloc(sizeof(long) * 100);
+  listeAlea(100,300);
+  affichertab(triIns,100);
+  triInsertion(triIns,100);
+  affichertab(triIns,100);
+
+  printf("Tri Rapide: \n");
+  long* triRap = listeAlea(100,300);
+  affichertab(triRap,100);
+  triRapide(triRap, 100);
+  affichertab(triRap,100);
+
+  printf("Tri Fusion: \n");
+  long* triFus = listeAlea(100,300);
+  affichertab(triFus,100);
+  triFusion(triFus, 100);
+  affichertab(triFus,100);
+
+  return 0;
+}
diff --git a/TP1/tridec.c b/TP1/tridec.c
new file mode 100644
index 0000000000000000000000000000000000000000..96fab4edd959729e0da0317f02e9a47a7b6b4663
--- /dev/null
+++ b/TP1/tridec.c
@@ -0,0 +1,108 @@
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "tris.h"
+
+void triInsertionDec(long* A, size_t n) {
+    for(size_t i = 1; i <= n-1; i++){
+        long cle = A[i];
+        size_t j = i - 1;
+        size_t ecriture=0;
+        while(j+1 >= j && A[j] > cle){
+            ecriture++;
+            A[j+1] = A[j];
+            j = j-1;
+        }
+        ecriture++;
+        A[j+1] = cle;
+    }
+}
+
+void triFusionDec(long* A, size_t size) {
+  sousTriFusionDec(A, 0, size);
+}
+
+void sousTriFusionDec(long* A, size_t first, size_t size) {
+    if(first+1 <size){ // p < r - 1
+        size_t middle = floor((first+size)/2);
+        sousTriFusionDec(A, first, middle);
+        sousTriFusionDec(A, middle, size);
+        fusionDec(A, first, middle, size);
+    }
+}
+
+void copySousTableDec(long* mainT, long* underT, size_t id, size_t size) {
+  for(size_t i = id; i < id+size; ++i) {
+    underT[i-id] = mainT[i];
+  }
+}
+
+void fusionDec(long* A, size_t first, size_t middle, size_t size) {
+    size_t n1 = middle - first; // Nb elem dans A[p , q]  q exclu
+    size_t n2 = size - middle;  // Nb elem dans A[q , r]  r exclu
+
+    size_t indg = 0;
+    size_t indd = 0;
+
+    long* ag = malloc(sizeof(long) * n1);
+    long* ad = malloc(sizeof(long) * n2);
+
+    copySousTableDec(A, ag, first, n1);
+    copySousTableDec(A, ad, middle, n2);
+
+    int i = first;
+
+    while(i < size) {
+      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(ag);
+    free(ad);
+}
+
+void triRapideDec(long* A, size_t n) {
+    sousTriRapideDec(A,0,n);
+}
+
+void sousTriRapideDec(long* A, size_t first, size_t size){
+    if(first+1 < size){
+        size_t middle = partitionDec(A,first,size);
+        sousTriRapideDec(A,first,middle);
+        sousTriRapideDec(A,middle+1,size);
+    }
+}
+
+size_t partitionDec(long* A, size_t first, size_t size) {
+    long pivot = A[size-1];
+    size_t i = first;
+    for(int j = first; j+2 <= size; j++){
+        if(A[j] <= pivot){
+            permuterDec(A,i,j);
+            i++;
+        }
+    }
+    permuterDec(A,i,size-1);
+    return i;
+}
+
+void permuterDec(long* A,size_t i,size_t j) {
+    long inter = A[i];
+    A[i] = A[j];
+    A[j] = inter;
+}
diff --git a/TP1/tridec.h b/TP1/tridec.h
new file mode 100644
index 0000000000000000000000000000000000000000..6b4dbf8aa7ae075c9115fca0a73588967c9c7dde
--- /dev/null
+++ b/TP1/tridec.h
@@ -0,0 +1,17 @@
+#ifndef TRIS_H
+#define TRIS_H
+#include <stdint.h>
+#include <stdlib.h>
+
+void triInsertionDec(long* A, size_t n);
+
+void triFusionDec(long* A, size_t size);
+void sousTriFusionDec(long* A, size_t first, size_t size);
+void fusionDec(long* A, size_t first, size_t middle, size_t size);
+
+void triRapideDec(long* A, size_t n);
+void sousTriRapideDec(long* A, size_t first, size_t size);
+size_t partitionDec(long* A, size_t first, size_t size);
+void permuterDec(long* A,size_t i,size_t j);
+
+#endif //TRIS_H
\ No newline at end of file
diff --git a/TP1/tris.c b/TP1/tris.c
new file mode 100644
index 0000000000000000000000000000000000000000..d3df80cbcad7dabaddc3cb3300a1f62e1b07dd95
--- /dev/null
+++ b/TP1/tris.c
@@ -0,0 +1,105 @@
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "tris.h"
+
+void triInsertion(long* A, size_t n) {
+    for(size_t i = 1; i <= n-1; i++){
+        long cle = A[i];
+        size_t j = i - 1;
+        while(j+1 >= j && A[j] > cle){
+            A[j+1] = A[j];
+            j = j-1;
+        }
+        A[j+1] = cle;
+    }
+}
+
+void triFusion(long* A, size_t size) {
+  sousTriFusion(A, 0, size);
+}
+
+void sousTriFusion(long* A, size_t first, size_t size) {
+    if(first+1 <size){ // p < r - 1
+        size_t middle = floor((first+size)/2);
+        sousTriFusion(A, first, middle);
+        sousTriFusion(A, middle, size);
+        fusion(A, first, middle, size);
+    }
+}
+
+void copySousTable(long* mainT, long* underT, size_t id, size_t size) {
+  for(size_t i = id; i < id+size; ++i) {
+    underT[i-id] = mainT[i];
+  }
+}
+
+void fusion(long* A, size_t first, size_t middle, size_t size) {
+    size_t n1 = middle - first; // Nb elem dans A[p , q]  q exclu
+    size_t n2 = size - middle;  // Nb elem dans A[q , r]  r exclu
+
+    size_t indg = 0;
+    size_t indd = 0;
+
+    long* ag = malloc(sizeof(long) * n1);
+    long* ad = malloc(sizeof(long) * n2);
+
+    copySousTable(A, ag, first, n1);
+    copySousTable(A, ad, middle, n2);
+
+    int i = first;
+
+    while(i < size) {
+      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(ag);
+    free(ad);
+}
+
+void triRapide(long* A, size_t n) {
+    sousTriRapide(A,0,n);
+}
+
+void sousTriRapide(long* A, size_t first, size_t size){
+    if(first+1 < size){
+        size_t middle = partition(A,first,size);
+        sousTriRapide(A,first,middle);
+        sousTriRapide(A,middle+1,size);
+    }
+}
+
+size_t partition(long* A, size_t first, size_t size) {
+    long pivot = A[size-1];
+    size_t i = first;
+    for(int j = first; j+2 <= size; j++){
+        if(A[j] <= pivot){
+            permuter(A,i,j);
+            i++;
+        }
+    }
+    permuter(A,i,size-1);
+    return i;
+}
+
+void permuter(long* A,size_t i,size_t j) {
+    long inter = A[i];
+    A[i] = A[j];
+    A[j] = inter;
+}
diff --git a/TP1/tris.h b/TP1/tris.h
new file mode 100644
index 0000000000000000000000000000000000000000..9841ffb6e67d3ae291493953eb6087b81d284159
--- /dev/null
+++ b/TP1/tris.h
@@ -0,0 +1,17 @@
+#ifndef TRIS_H
+#define TRIS_H
+#include <stdint.h>
+#include <stdlib.h>
+
+void triInsertion(long* A, size_t n);
+
+void triFusion(long* A, size_t size);
+void sousTriFusion(long* A, size_t first, size_t size);
+void fusion(long* A, size_t first, size_t middle, size_t size);
+
+void triRapide(long* A, size_t n);
+void sousTriRapide(long* A, size_t first, size_t size);
+size_t partition(long* A, size_t first, size_t size);
+void permuter(long* A,size_t i,size_t j);
+
+#endif //TRIS_H
diff --git a/TP1/tris.o b/TP1/tris.o
new file mode 100644
index 0000000000000000000000000000000000000000..3efd234b62b12a752cf80fdb172ff874b2259a64
Binary files /dev/null and b/TP1/tris.o differ
diff --git a/TP1/utils.c b/TP1/utils.c
new file mode 100644
index 0000000000000000000000000000000000000000..3715ef2ad44103addcb5ba36954139273f0944c5
--- /dev/null
+++ b/TP1/utils.c
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "utils.h"
+
+void affichertab(long* T, int s){
+    printf("[ ");
+    for(int i = 0; i < s-1; i++){
+        printf("%d , ",T[i]);
+    }
+    printf("%d ]\n",T[s-1]);
+}
+
+long* listeAlea(size_t longeur, size_t N){
+    long liste[longeur];
+    for(size_t i = 0; i < longeur; i++){
+        liste[i] = rand() % N; 
+    }
+    return liste;  
+} 
\ No newline at end of file
diff --git a/TP1/utils.h b/TP1/utils.h
new file mode 100644
index 0000000000000000000000000000000000000000..d36682b4fd5b01fcae7507a775a26abb9a5cc227
--- /dev/null
+++ b/TP1/utils.h
@@ -0,0 +1,5 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void affichertab(long* T, int s);
+long* listeAlea(size_t longeur, size_t N);
\ No newline at end of file
diff --git a/TP1/utils.o b/TP1/utils.o
new file mode 100644
index 0000000000000000000000000000000000000000..1efc08401d93d50fd87c0b5a4cc61da2ae97ead8
Binary files /dev/null and b/TP1/utils.o differ