diff --git a/source_codes/sorting/Makefile b/source_codes/sorting/Makefile
deleted file mode 100644
index 36389c6b0a77faf226d0f2bb6d08b8329950b35c..0000000000000000000000000000000000000000
--- a/source_codes/sorting/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-CC:=gcc
-# SAN:=-fsanitize=address
-CFLAGS:=-Wall -Wextra -pedantic -g $(SAN)
-LDFLAGS:=-lm $(SAN)
-
-all: tris_base_part tris_base quicksort heapsort_main quicksort_part 
-
-tris_base_part: tris_base_part.c 
-	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
-	@echo $@ >> .gitignore
-
-tris_base: tris_base.c 
-	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
-	@echo $@ >> .gitignore
-
-quicksort: quicksort.c 
-	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
-	@echo $@ >> .gitignore
-
-quicksort_part: quicksort_part.c 
-	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
-	@echo $@ >> .gitignore
-
-heapsort_main: heapsort_main.c heapsort.o 
-	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
-	@echo $@ >> .gitignore
-	@echo *.o >> .gitignore
-
-
-heapsort.o: heapsort.h
-
-.PHONY: clean all
-
-clean:
-	rm -f *.o tris_base tris_base_part quicksort_part quicksort heapsort_main .gitignore
-
diff --git a/source_codes/sorting/heapsort/Makefile b/source_codes/sorting/heapsort/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..2dc0918a8e55a128537cd82f6d554379ab0bfbf4
--- /dev/null
+++ b/source_codes/sorting/heapsort/Makefile
@@ -0,0 +1,19 @@
+CC:=gcc
+# SAN:=-fsanitize=address
+CFLAGS:=-Wall -Wextra -pedantic -g $(SAN)
+LDFLAGS:=-lm $(SAN)
+
+all: heapsort_main
+
+heapsort_main: heapsort_main.c heapsort.o 
+	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
+	@echo $@ >> .gitignore
+	@echo *.o >> .gitignore
+
+heapsort.o: heapsort.h
+
+.PHONY: clean all
+
+clean:
+	rm -f *.o heapsort_main .gitignore
+
diff --git a/source_codes/sorting/heapsort.c b/source_codes/sorting/heapsort/heapsort.c
similarity index 87%
rename from source_codes/sorting/heapsort.c
rename to source_codes/sorting/heapsort/heapsort.c
index d65e5677ec7767901d25a6701831907f1a870a9b..6531cddef9a43cc65601312ac6ee5c38d942d3ff 100644
--- a/source_codes/sorting/heapsort.c
+++ b/source_codes/sorting/heapsort/heapsort.c
@@ -8,13 +8,6 @@ static void swap(int* a,int* b) {
    *b = tmp;
 }
 
-static void print(int* tab,int size,char* str) {
-   for (int i=0;i<size;i++) {
-      printf("%d ",tab[i]);
-   }
-   printf("%s",str);
-}
-
 void heapsort(int* tab,int size) {
    entassement(tab,size);
    swap(tab,tab+size-1);
diff --git a/source_codes/sorting/heapsort.h b/source_codes/sorting/heapsort/heapsort.h
similarity index 100%
rename from source_codes/sorting/heapsort.h
rename to source_codes/sorting/heapsort/heapsort.h
diff --git a/source_codes/sorting/heapsort_main.c b/source_codes/sorting/heapsort/heapsort_main.c
similarity index 89%
rename from source_codes/sorting/heapsort_main.c
rename to source_codes/sorting/heapsort/heapsort_main.c
index a1b8cfcc9eb5a677e72c5533c41b3432a398a1ca..1bf83bc47887ddfa010b8b7fecf2b94d01005ed6 100644
--- a/source_codes/sorting/heapsort_main.c
+++ b/source_codes/sorting/heapsort/heapsort_main.c
@@ -11,10 +11,10 @@ int main(int argc, char** argv) {
    int size = 10, inf = 0, delta = 20;
    switch(argc) {
       case 4: delta = atoi(argv[3]);
-      case 3: inf = atoi(argv[2]);     
+      case 3: inf = atoi(argv[2]);
       case 2: size = atoi(argv[1]);
    }
-   int* tab = (int*)malloc(size*sizeof(int));
+   int* tab = malloc(size*sizeof(int));
    rand_init(tab,size,inf,delta);
    print(tab,size,"\n=========\n");
    heapsort(tab,size);
diff --git a/source_codes/sorting/heapsort_part.c b/source_codes/sorting/heapsort/heapsort_part.c
similarity index 100%
rename from source_codes/sorting/heapsort_part.c
rename to source_codes/sorting/heapsort/heapsort_part.c
diff --git a/source_codes/sorting/quicksort.c b/source_codes/sorting/quicksort.c
deleted file mode 100644
index 7357b69f03b3f91b1d7c4184de751c15da32c229..0000000000000000000000000000000000000000
--- a/source_codes/sorting/quicksort.c
+++ /dev/null
@@ -1,80 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <assert.h>
-
-void print(int size,int tab[size]) {
-   for (int i=0;i<size;i++) {
-      printf("%d ",tab[i]);
-   }
-}
-
-void random_tab(int size,int tab[size],int inf,int sup) {
-   assert(sup > inf);
-   for (int i=0;i<size;i++) {
-      tab[i] = inf+rand()%(sup-inf);
-   }
-}
-
-void swap(int* p_a,int* p_b) { 
-   int tmp = *p_a;
-   *p_a = *p_b;
-   *p_b = tmp;
-}
-
-int partition(int size,int array[size],int first,int last) {
-   int pivot = array[last];
-   int i = first-1,j = last;
-   do {
-      do {
-         i++;
-      } while (array[i] < pivot && i<j);
-      do {
-         j--;
-      } while(array[j] > pivot && i<j);
-      if (j>i) {
-         swap(&array[i],&array[j]);
-      }
-   } while (j > i);
-   swap(&array[i],&array[last]);
-   return i;
-}
-
-void quicksort(int size,int array[size],int first,int last) {
-   if (first < last) {
-      int midpoint = partition(size,array,first,last);
-      if (first < midpoint-1) {
-         quicksort(size,array,first,midpoint-1);
-      }
-      if (midpoint+1 < last) {
-         quicksort(size,array,midpoint+1,last);
-      }
-   }
-}
-
-void test_ordre(int size,int array[size]) {
-   for (int i=0;i<size-1;i++) {
-      if (array[i] > array[i+1]) {
-         printf("erreur");
-         return;
-      }
-   }
-   printf("ok");
-}
-
-int main(int argc,char** argv) {
-   int size = atoi(argv[1]);
-   int seed = atoi(argv[2]);
-   srand(seed);
-   int* res = malloc(size*sizeof(int));
-   for (int k=0;k<20;k++) {
-      random_tab(size,res,0,100);
-      print(size,res);
-      printf("\n");
-      quicksort(size,res,0,size-1);
-      print(size,res);
-      test_ordre(size,res);
-      printf("\n================\n");
-   }
-}
-
diff --git a/source_codes/sorting/quicksort_part.c b/source_codes/sorting/quicksort_part.c
deleted file mode 100644
index 41b4413066536a121e4ac3558611ccad216b2a21..0000000000000000000000000000000000000000
--- a/source_codes/sorting/quicksort_part.c
+++ /dev/null
@@ -1,94 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdbool.h>
-
-void print(int size,int tab[size]) {
-   for (int i=0;i<size;i++) {
-      printf("%d ",tab[i]);
-   }
-   printf("\n");
-}
-
-void random_tab(int size,int tab[size],int inf,int sup) {
-   for (int i=0;i<size;i++) {
-      tab[i] = inf+rand()%(sup-inf);
-   }
-}
-
-void swap(int* p_a,int* p_b) { 
-   int tmp = *p_a;
-   *p_a = *p_b;
-   *p_b = tmp;
-}
-
-// Partition du tableau <array> autour d'une valeur pivot:
-// compléter le code
-int partition(int size,int array[size],int first,int last) {
-   int pivot = array[last];
-   int i = first-1,j = last;
-   do {
-      // à compléter pour <i>: do {...} while (...);
-      // à compléter pour <j>: do {...} while (...);
-      // à compléter: échanger cases <i> et <j> du tableau <array>
-   } while (j > i);
-   // à compléter: échanger cases <i> et <last> du tableau <array>
-   return i;
-}
-
-// Tri rapide récursif
-void quicksort(int size,int array[size],int first,int last) {
-   if (first < last) {
-      int midpoint = partition(size,array,first,last);
-      if (first < midpoint-1) {
-         quicksort(size,array,first,midpoint-1);
-      }
-      if (midpoint+1 < last) {
-         quicksort(size,array,midpoint+1,last);
-      }
-   }
-}
-
-// Test si le tableau <array> est ordonné croissant
-void test_ordre(int size,int array[size]) {
-   for (int i=0;i<size-1;i++) { 
-      if (array[i] > array[i+1]) {
-         printf("erreur");
-         return;
-      }
-   }
-   printf("ok");
-}
-
-int main(int argc,char** argv) {
-   int size = atoi(argv[1]);
-   int seed = atoi(argv[2]);
-   srand(seed);
-   int* res = (int*)malloc(size*sizeof(int));
-   for (int k=0;k<20;k++) {
-      random_tab(size,res,0,100);
-      print(size,res);
-      quicksort(size,res,0,size-1);
-      print(size,res);
-      test_ordre(size,res);
-      printf("\n================\n");
-   }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/source_codes/sorting/tri_2_piles/Makefile b/source_codes/sorting/tri_2_piles/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..f4e072c2dcc0212a0222da8c716facf9a05f1ae1
--- /dev/null
+++ b/source_codes/sorting/tri_2_piles/Makefile
@@ -0,0 +1,24 @@
+CC:=gcc
+# SAN:=-fsanitize=address
+CFLAGS:=-Wall -Wextra -pedantic -g $(SAN)
+LDFLAGS:=-lm $(SAN)
+
+all: tri_2_piles 
+
+tri_2_piles: tri_2_piles.o pile_ptr.o
+	$(CC) -D TYPE=int $(CFLAGS) -o $@ $^ $(LDFLAGS)
+	@echo $@ >> .gitignore
+
+tri_2_piles.o: tri_2_piles.c
+	$(CC) -c -D TYPE=int $(CFLAGS) $^ $(LDFLAGS)
+	@echo *.o >> .gitignore
+
+pile_ptr.o: pile_ptr.c pile_ptr.h
+	$(CC) -c -D TYPE=int $(CFLAGS) $^ $(LDFLAGS)
+	@echo *.o >> .gitignore
+
+.PHONY: clean all
+
+clean:
+	rm -f *.o *.gch tri_2_piles .gitignore
+
diff --git a/source_codes/sorting/tri_2_piles/pile_ptr.c b/source_codes/sorting/tri_2_piles/pile_ptr.c
new file mode 100644
index 0000000000000000000000000000000000000000..d9cf8a0c05cba93984e9a4e56156e9d55a4572c7
--- /dev/null
+++ b/source_codes/sorting/tri_2_piles/pile_ptr.c
@@ -0,0 +1,60 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <assert.h>
+#include "pile_ptr.h"
+
+
+//Creer une nouvelle pile vide
+pile pile_creer() {
+   return NULL;
+}
+
+//Tester si la pile est vide
+bool pile_est_vide(pile stack) {
+	return (NULL == stack);
+}
+
+//Inserer un élement en début de pile
+void pile_empiler(pile* stack,info val) {
+   element* elmt = malloc(sizeof(element));
+   elmt->data = val;
+   elmt->next = *stack;
+   *stack = elmt;
+}
+
+//Consulter l'élément au sommet de la pile
+info pile_sommet(pile stack) {
+   assert(!pile_est_vide(stack));
+   return stack->data;
+}
+
+//Supprimer un élément de la pile
+info pile_depiler(pile* stack) {
+   info data = pile_sommet(*stack);
+   element* elmt = *stack;
+   *stack = (*stack)->next; 
+   free(elmt);    
+   return data; 
+}
+
+//Désallouer complètement la pile
+void pile_detruire(pile* stack) {
+   while (!pile_est_vide(*stack)) {      
+      pile_depiler(stack);
+   }   
+}
+
+//Compter le nombre d'éléments de la pile:
+int pile_count(pile stack) {
+   int cnt = 0;
+   while (NULL != stack) {      
+      stack = stack->next;
+      cnt++;
+   }
+   return cnt;
+}
+
+
+
+
diff --git a/source_codes/sorting/tri_2_piles/pile_ptr.h b/source_codes/sorting/tri_2_piles/pile_ptr.h
new file mode 100644
index 0000000000000000000000000000000000000000..507001ee84b7dee2375553f6644e3ebd67eb86ca
--- /dev/null
+++ b/source_codes/sorting/tri_2_piles/pile_ptr.h
@@ -0,0 +1,32 @@
+/* pour éviter que le précompilateur 
+   inclue plusieurs fois le fichier .h */
+#ifndef PILE_PTR_H  
+#define PILE_PTR_H
+#include <stdbool.h>
+/* Définir à la compilation de TYPE 
+   p.ex. gcc -c -D TYPE=int pile_ptr.h pile_ptr.c */
+typedef TYPE info;
+/* Utilité du typedef : 
+   Element a; <=> struct Element a; */
+typedef struct _element {
+   info data;
+   struct _element* next;
+} element;
+typedef element* pile;
+
+//Créer d'une nouvelle pile vide
+pile pile_creer();
+//Désallouer complètement la pile
+void pile_detruire(pile* stack);
+//Empiler un élement en début de pile
+void pile_empiler(pile* stack,info val);
+//Dépiler un élément de la pile
+info pile_depiler(pile* stack);
+//Consulter l'élément au sommet de la pile
+info pile_sommet(pile stack);
+//Tester si la pile est vide
+bool pile_est_vide(pile stack);
+//Compter le nombre d'éléments de la pile:
+int pile_count(pile stack);
+#endif
+
diff --git a/source_codes/sorting/tri_2_piles/tri_2_piles.c b/source_codes/sorting/tri_2_piles/tri_2_piles.c
new file mode 100644
index 0000000000000000000000000000000000000000..ca7fbb61edc54c8b36968167e98f08aa46c35d99
--- /dev/null
+++ b/source_codes/sorting/tri_2_piles/tri_2_piles.c
@@ -0,0 +1,87 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include "pile_ptr.h"
+
+void print(int size,int tab[size]);
+void random_tab(int size,int tab[size],int inf,int sup);
+void test_ordre(int size,int array[size]);
+
+void tri_2_pile(int size,int tab[size]);
+
+int main(int argc,char** argv) {
+   if (2 != argc) {
+      return 1;
+   }
+   int size = atoi(argv[1]);
+   int seed = atoi(argv[2]);
+   srand(seed);
+   int* res = malloc(size*sizeof(int));
+   for (int k=0;k<20;k++) {
+      random_tab(size,res,0,100);
+      print(size,res);
+      printf("\n");
+      tri_2_pile(size,res);
+      print(size,res);
+      test_ordre(size,res);
+      printf("\n================\n");
+   }  
+   return 0;  
+}
+
+bool condition(int a,int b,char* op) {
+   if (strcmp(op,"<") == 0) {
+      return a < b;
+   } else if (strcmp(op,">=") == 0) {
+      return a >= b;
+   } else if (strcmp(op,"") == 0) {
+      return true;
+   } else {
+      return false;
+   }
+}
+
+void transfert(pile* pile_g,pile* pile_d,int val,char* op) {
+   while (!pile_est_vide(*pile_g) 
+          && condition(pile_sommet(*pile_g),val,op)) {
+      pile_empiler(pile_d,pile_depiler(pile_g));
+   }
+}
+
+void tri_2_pile(int size,int tab[size]) {
+   pile pile_g = pile_creer(), pile_d = pile_creer();
+   for (int i=0;i<size;i++) {
+      transfert(&pile_g,&pile_d,tab[i],"<");
+      transfert(&pile_d,&pile_g,tab[i],">=");
+      pile_empiler(&pile_g,tab[i]);
+   }
+   transfert(&pile_d,&pile_g,0,"");
+   for (int i=0;i<size;i++) {
+      tab[i] = pile_depiler(&pile_g);
+   }
+}
+
+void print(int size,int tab[size]) {
+   for (int i=0;i<size;i++) {
+      printf("%d ",tab[i]);
+   }
+}
+
+void random_tab(int size,int tab[size],int inf,int sup) {
+   for (int i=0;i<size;i++) {
+      tab[i] = inf+rand()%(sup-inf);
+   }
+}
+
+void test_ordre(int size,int array[size]) {
+   for (int i=0;i<size-1;i++) {
+      if (array[i] > array[i+1]) {
+         printf("erreur");
+         return;
+      }
+   }
+   printf("ok");
+}
+
+
diff --git a/source_codes/sorting/tris_basiques/Makefile b/source_codes/sorting/tris_basiques/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..9a2645067476925d5b01d7b5015ac58f078f8306
--- /dev/null
+++ b/source_codes/sorting/tris_basiques/Makefile
@@ -0,0 +1,20 @@
+CC:=gcc
+# SAN:=-fsanitize=address
+CFLAGS:=-Wall -Wextra -pedantic -g $(SAN)
+LDFLAGS:=-lm $(SAN)
+
+all: tris_base_part tris_base
+
+tris_base_part: tris_base_part.c 
+	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
+	@echo $@ >> .gitignore
+
+tris_base: tris_base.c 
+	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
+	@echo $@ >> .gitignore
+
+.PHONY: clean all
+
+clean:
+	rm -f *.o tris_base tris_base_part .gitignore
+
diff --git a/source_codes/sorting/tris_base.c b/source_codes/sorting/tris_basiques/tris_base.c
similarity index 97%
rename from source_codes/sorting/tris_base.c
rename to source_codes/sorting/tris_basiques/tris_base.c
index dfbd099cc12698438b800a1d5c01582b2aa90591..a47259ce1dab832935c86d8cfac8b6b1e8b2f030 100644
--- a/source_codes/sorting/tris_base.c
+++ b/source_codes/sorting/tris_basiques/tris_base.c
@@ -7,7 +7,7 @@ void tri_insertion(int size,int tab[size]);
 void tri_bulle(int size,int tab[size]);
 void tri_selection(int size,int tab[size]);
 
-void main(int argc,char** argv) {
+int main(int argc,char** argv) {
    if (argc != 4) {
       printf("usage: program <size> <seed> <sorting_algo_number>\n");
       exit(EXIT_FAILURE);
@@ -19,7 +19,6 @@ void main(int argc,char** argv) {
    int res[size];
    random_tab(size,res);
    print(size,res);
-   printf("\n");
    switch(choix) {
       case 1: tri_bulle(size,res); break;
       case 2: tri_selection(size,res); break;
@@ -27,13 +26,14 @@ void main(int argc,char** argv) {
       default: printf("Choix non available\n");
    }
    print(size,res);
-   printf("\n");
+   return 0;
 }
 
 void print(int size,int tab[size]) {
    for (int i=0;i<size;i++) {
       printf("%d ",tab[i]);
    }
+   printf("\n");  
 }
 
 void random_tab(int size,int tab[size]) {
diff --git a/source_codes/sorting/tris_base_part.c b/source_codes/sorting/tris_basiques/tris_base_part.c
similarity index 99%
rename from source_codes/sorting/tris_base_part.c
rename to source_codes/sorting/tris_basiques/tris_base_part.c
index f41a20e0e43fc8db5bf697160b28ee80c2f4b6b7..09ac5bdd37e63941366b30063e48294e076ce6af 100644
--- a/source_codes/sorting/tris_base_part.c
+++ b/source_codes/sorting/tris_basiques/tris_base_part.c
@@ -23,7 +23,6 @@ int main(int argc,char** argv) {
    int res[size];
    random_tab(size,res);
    print(size,res);
-   printf("\n");
    switch(choix) {
       case 1: tri_bulle(size,res); break;
       case 2: tri_selection(size,res); break;
@@ -31,7 +30,6 @@ int main(int argc,char** argv) {
       default: printf("Choix non available\n");
    }
    print(size,res);
-   printf("\n");
    return EXIT_SUCCESS;
 }
 
@@ -102,6 +100,7 @@ void print(int size,int tab[size]) {
    for (int i=0;i<size;i++) {
       printf("%d ",tab[i]);
    }
+   printf("\n");
 }
 
 void random_tab(int size,int tab[size]) {