diff --git a/TP2/Makefile b/TP2/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..4ef68c03f7953ab2723c38e05c9466be1a6040f7
--- /dev/null
+++ b/TP2/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/TP2/main b/TP2/main
new file mode 100755
index 0000000000000000000000000000000000000000..4bcea08537181edf148e3c95d4cc01c68c08e7ef
Binary files /dev/null and b/TP2/main differ
diff --git a/TP2/main.c b/TP2/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..c9c57bbff3d58a7349d03e767b597041fa090772
--- /dev/null
+++ b/TP2/main.c
@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "tris.h"
+#include "utils.h"
+
+int main(int argc, char *argv[]) {
+  if(argc != 4) {
+    printf("Usage: %s [typeAlgo] [taille] [isAfficher]\n", argv[0]);
+    exit(1);
+  }
+
+  char typeAlgo = argv[1][0];
+  long taille = (long) atoi(argv[2]);
+  long MAX = 50;
+  long tab[taille];
+  size_t afficher = (size_t) atoi(argv[3]);
+
+  genTab(tab, taille, MAX);
+
+  switch(typeAlgo) {
+    case 'i':
+      printf("Tri Insertion: \n");
+      triInsertion(tab,taille);
+
+      if(afficher)
+        affichertab(tab,taille);
+      break;
+
+    case 'r':
+      printf("Tri Rapide: \n");
+      triRapide(tab, taille);
+
+      if(afficher)
+        affichertab(tab,taille);
+      break;
+
+    case 'f':
+      printf("Tri Fusion: \n");
+      triFusion(tab, taille);
+
+      if(afficher)
+        affichertab(tab,taille);
+      break;
+  }
+
+  return 0;
+}
diff --git a/TP2/test.sh b/TP2/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..6fbf71901ae77d35b32825602caeef21f16f165c
--- /dev/null
+++ b/TP2/test.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+algo = "insertion"
+taille = 10000
+
+for iTest in 'seq 1 100'
+do
+    res = (/usr/bin/time -f "%U\t%M" ./main $algo $taille)
+    echo -e "$iTest\t$taille\t$res"
+done
diff --git a/TP2/tris.c b/TP2/tris.c
new file mode 100644
index 0000000000000000000000000000000000000000..d3df80cbcad7dabaddc3cb3300a1f62e1b07dd95
--- /dev/null
+++ b/TP2/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/TP2/tris.h b/TP2/tris.h
new file mode 100644
index 0000000000000000000000000000000000000000..9841ffb6e67d3ae291493953eb6087b81d284159
--- /dev/null
+++ b/TP2/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/TP2/tris.o b/TP2/tris.o
new file mode 100644
index 0000000000000000000000000000000000000000..feb455293f158d5d0ad902bbc1189c5183749779
Binary files /dev/null and b/TP2/tris.o differ
diff --git a/TP2/utils.c b/TP2/utils.c
new file mode 100644
index 0000000000000000000000000000000000000000..bd523d7bbe4e9a88b62a07f2ef00106b81352ec5
--- /dev/null
+++ b/TP2/utils.c
@@ -0,0 +1,18 @@
+#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]);
+}
+
+void genTab(long* T, long taille, long MAX) {
+  // Generer le tableau
+  for(long i = 0; i < taille; ++i) {
+    T[i] = rand() % MAX;
+  }
+}
diff --git a/TP2/utils.h b/TP2/utils.h
new file mode 100644
index 0000000000000000000000000000000000000000..0c016ab825d0f621678a3aabcaf2a997a62a02c8
--- /dev/null
+++ b/TP2/utils.h
@@ -0,0 +1,5 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void affichertab(long* T, int s);
+void genTab(long* T, long taille, long MAX);
diff --git a/TP2/utils.o b/TP2/utils.o
new file mode 100644
index 0000000000000000000000000000000000000000..2408e3a0b5ba8709487bf1b2022345b78b83b3d0
Binary files /dev/null and b/TP2/utils.o differ