diff --git a/src/main/java/fr/univamu/sorting/CountingSortable.java b/src/main/java/fr/univamu/sorting/CountingSortable.java
new file mode 100644
index 0000000000000000000000000000000000000000..43bf9d2424c4605b2c08a820149729d28e4b846a
--- /dev/null
+++ b/src/main/java/fr/univamu/sorting/CountingSortable.java
@@ -0,0 +1,53 @@
+package fr.univamu.sorting;
+
+import java.util.List;
+
+public class CountingSortable<T extends Comparable<T>> extends SortableDecorator<T> {
+
+    private  Sortable<T> values;
+    public static int countingSwaps = 0;
+    public static int countingCompare = 0;
+
+    public CountingSortable( Sortable<T> values) {
+        super(values);
+    }
+
+
+    public int size(){
+        return super.size();
+    }
+
+    public T get(int index){
+       return super.get(index);
+    }
+
+
+    public void swap (int index1, int index2){
+        countingSwaps++;
+        super.swap(index1,index2);
+
+    }
+
+    public int compare (int index1, int index2){
+        countingCompare ++;
+        return super.compare(index1,index2);
+
+    }
+
+
+    public void set(int index, T value) {
+        super.set(index, value);
+    }
+
+    public List<T> getSortableParameter() {
+        return super.getSortableParameter();
+    }
+
+    public int getCountingCompare() {
+        return countingCompare;
+    }
+
+    public int getCountingSwaps(){
+        return countingSwaps;
+    }
+}
diff --git a/src/main/java/fr/univamu/sorting/InsertionSort.java b/src/main/java/fr/univamu/sorting/InsertionSort.java
index 43dd3002e6c04572399d568942244ca3ef08f557..669138f120b627c932e29c0c910d8519526358b3 100644
--- a/src/main/java/fr/univamu/sorting/InsertionSort.java
+++ b/src/main/java/fr/univamu/sorting/InsertionSort.java
@@ -1,19 +1,19 @@
 package fr.univamu.sorting;
 
-public class InsertionSort implements  Sorter{
-    private final Sortable sortable;
-    public InsertionSort( Sortable sortable){
+public class InsertionSort<T extends Comparable<T>> implements Sorter<T>{
+    private final Sortable<T> sortable;
+    public InsertionSort( Sortable<T> sortable){
         this.sortable = sortable;
     }
 
     public void sort() {
         int n = sortable.size();
         for (int i = 1; i < n; ++i) {
-            int presentElement = sortable.get(i);
+            T presentElement = sortable.get(i);
             int j = i - 1;
 
 
-            while (j >= 0 && sortable.get(j) > presentElement) {
+            while (j >= 0 && sortable.compare(j,i) > 0) {
                 sortable.set(j + 1, sortable.get(j));
                 j = j - 1;
             }
@@ -21,7 +21,8 @@ public class InsertionSort implements  Sorter{
         }
     }
 
-    public Sortable getSortable (){
+
+    public Sortable<T> getSortable (){
         return sortable;
     }
 
diff --git a/src/main/java/fr/univamu/sorting/LoggingSortable.java b/src/main/java/fr/univamu/sorting/LoggingSortable.java
new file mode 100644
index 0000000000000000000000000000000000000000..6c9f91247a9e620d8cd0ebb92f09ebbdf6e6a368
--- /dev/null
+++ b/src/main/java/fr/univamu/sorting/LoggingSortable.java
@@ -0,0 +1,52 @@
+package fr.univamu.sorting;
+
+import java.io.PrintStream;
+import java.util.List;
+
+public class LoggingSortable<T extends Comparable<T>> extends SortableDecorator<T> {
+
+    private Sortable<T> values;
+    private PrintStream logStream;
+
+    public LoggingSortable (Sortable<T> values){
+         super(values);
+    }
+
+
+    @Override
+    public void swap(int index1, int index2) {
+        super.swap(index1, index2);
+        logStream.println("swap : "+index1+" et "+index2);
+    }
+
+    @Override
+    public int compare(int index1, int index2) {
+        logStream.println("Compare : "+index1+" et "+index2);
+        return super.compare(index1,index2);
+
+    }
+
+    @Override
+    public int size() {
+        return super.size();
+    }
+
+    @Override
+    public T get(int index) {
+        return super.get(index);
+    }
+
+    @Override
+    public void set(int index, T value) {
+        super.set(index, value);
+    }
+
+    @Override
+    public List<T> getSortableParameter() {
+        return super.getSortableParameter();
+    }
+
+    public PrintStream getLogStream() {
+        return logStream;
+    }
+}
diff --git a/src/main/java/fr/univamu/sorting/QuickSort.java b/src/main/java/fr/univamu/sorting/QuickSort.java
index f0e7002af0837d969a4c5e2ee540563edd7c38db..d3d66e9de8b5fe3e1dbb672d6c5bb10841bfa8c9 100644
--- a/src/main/java/fr/univamu/sorting/QuickSort.java
+++ b/src/main/java/fr/univamu/sorting/QuickSort.java
@@ -2,20 +2,20 @@ package fr.univamu.sorting;
 
 
 
-public class QuickSort implements Sorter {
-    private final Sortable sortable;
+public class QuickSort<T extends Comparable<T>> implements Sorter<T> {
+    private final Sortable<T> sortable;
 
-    public QuickSort(Sortable sortable) {
+    public QuickSort(Sortable<T> sortable) {
         this.sortable = sortable;
     }
 
     private int partition(int start , int end) {
-        int pivot = sortable.get(end);
+        //T pivot = sortable.get(end);
         int i = start - 1;
 
         for (int j = start; j < end; j++) {
-            int bool = sortable.compare(sortable.get(j),pivot);
-            if (bool == -1 || bool==0){
+            int bool = sortable.compare(j,end);
+            if (bool <= 0){
                 i++;
                 sortable.swap(i, j);
             }
@@ -42,7 +42,7 @@ public class QuickSort implements Sorter {
     }
 
 
-    public Sortable getSortable (){
+    public Sortable<T> getSortable (){
         return sortable;
     }
 
diff --git a/src/main/java/fr/univamu/sorting/Sortable.java b/src/main/java/fr/univamu/sorting/Sortable.java
index 5c9f004b97c70054cb0e91177872d84e4d21d3d3..2049048c164d3ba5ccbb2ea23599efa89a36df7b 100644
--- a/src/main/java/fr/univamu/sorting/Sortable.java
+++ b/src/main/java/fr/univamu/sorting/Sortable.java
@@ -2,18 +2,18 @@ package fr.univamu.sorting;
 
 import java.util.List;
 
-public interface Sortable {
+public interface Sortable<T extends Comparable<T>> {
     void  swap (int index1, int index2);
 
-    int compare (int index1, int index2);
+    int compare (int  index1, int index2);
 
     int size();
 
-    int get( int index);
+    T get( int index);
 
-    void  set(int index, int value);
+    void  set(int index,T value);
 
-    List<Integer> getSortableParameter();
+    List<T> getSortableParameter();
 
 
 }
diff --git a/src/main/java/fr/univamu/sorting/SortableDecorator.java b/src/main/java/fr/univamu/sorting/SortableDecorator.java
new file mode 100644
index 0000000000000000000000000000000000000000..3709e8d497b1be43f8776fc8b7f9b3ba6b429202
--- /dev/null
+++ b/src/main/java/fr/univamu/sorting/SortableDecorator.java
@@ -0,0 +1,42 @@
+package fr.univamu.sorting;
+
+import java.util.List;
+
+public abstract class SortableDecorator<T extends Comparable<T>> implements Sortable<T>{
+    private final Sortable<T> values;
+    public SortableDecorator (Sortable<T> sortables){
+        this.values = sortables;
+    }
+
+
+    @Override
+    public int size() {
+        return values.size();
+    }
+
+    @Override
+    public T get(int index) {
+        return values.get(index);
+    }
+
+    @Override
+    public void set(int index, T value) {
+        values.set(index,value);
+    }
+
+    @Override
+    public List<T> getSortableParameter() {
+        return values.getSortableParameter();
+    }
+
+    @Override
+    public int compare(int index1, int index2) {
+        return values.compare(index1,index1);
+    }
+
+    @Override
+    public void swap(int index1, int index2) {
+        values.swap(index1,index2);
+    }
+}
+
diff --git a/src/main/java/fr/univamu/sorting/SortableIntArray.java b/src/main/java/fr/univamu/sorting/SortableIntArray.java
index 62e3bac79a93aacc4722633a431282d184765f9b..997b47014329810cf82326b4fb04f8f17708ab14 100644
--- a/src/main/java/fr/univamu/sorting/SortableIntArray.java
+++ b/src/main/java/fr/univamu/sorting/SortableIntArray.java
@@ -1,48 +1,56 @@
 package fr.univamu.sorting;
 
 
+import java.util.Arrays;
 import java.util.List;
 
-public class SortableIntArray implements Sortable{
-    private final int[] array;
+public class SortableIntArray<T extends Comparable<T>> implements Sortable <T>{
 
-    public SortableIntArray (int [] tab) {
+    private final T[] array;
+
+    public SortableIntArray (T[] tab) {
         this.array = tab;
     }
 
 
     public void swap(int index1, int index2){
-        int temp = array[index1];
+        T temp = array[index1];
         array[index1] = array[index2];
         array[index2] = temp;
     }
 
-    public int compare (int index1, int index2){
+    @Override
+    public int compare(int index1, int index2) {
+        return array[index1].compareTo(array[index2]);
+    }
+
+/* public int compare (Integer index1, Integer index2){
         if (index1 >= index2) {
             if (index1 > index2) return 1;
             else return 0;
         } else {
             return -1;
-        }
-    }
+
+
+    }*/
 
     public int size(){
         return array.length;
     }
 
 
-    public int get(int index){
+    public T get(int index){
         return array[index];
     }
 
     //// a voir avec le prof
     @Override
-    public List<Integer> getSortableParameter() {
-        return null;
+    public List<T> getSortableParameter() {
+        return Arrays.asList(array);
     }
 
     @Override
-    public void set(int index, int value) {
+    public void set(int index, T value) {
         array[index] = value;
     }
 }
diff --git a/src/main/java/fr/univamu/sorting/SortableIntList.java b/src/main/java/fr/univamu/sorting/SortableIntList.java
index 64dc00d558d58155a7f193172350fe23e4c59e0d..6823139a58666d0fd3e6b6ab866d35c5954b0852 100644
--- a/src/main/java/fr/univamu/sorting/SortableIntList.java
+++ b/src/main/java/fr/univamu/sorting/SortableIntList.java
@@ -2,15 +2,15 @@ package fr.univamu.sorting;
 
 import java.util.List;
 
-public class SortableIntList implements Sortable {
-    private final  List<Integer> list;
+public class SortableIntList <T extends Comparable<T>> implements Sortable<T> {
+    private final  List<T> list;
 
-    public SortableIntList (List<Integer> lists){
+    public SortableIntList (List<T> lists){
         this.list = lists;
     }
 
     public void swap (int index1, int index2){
-        int temp = list.get(index1);
+        T temp = list.get(index1);
         list.set(index1, list.get(index2));
         list.set(index2, temp);
     }
@@ -19,25 +19,30 @@ public class SortableIntList implements Sortable {
         return list.size();
     }
 
-    public int get (int index){
+    public T get (int index){
         return list.get(index);
     }
 
-    public int compare (int index1, int index2){
+    @Override
+    public int compare(int index1, int index2) {
+        return list.get(index1).compareTo(list.get(index2));
+    }
+/*public int compare (T index1, T index2){
         if (index1 >= index2) {
             if (index1 > index2) return 1;
             else return 0;
         } else {
             return -1;
         }
-    }
+        //return compare(index1,index2);
+    }*/
 
-    public List<Integer> getSortableParameter() {
+    public List<T> getSortableParameter() {
         return list;
     }
 
     @Override
-    public void set(int index, int value) {
+    public void set(int index, T value) {
         list.set(index,value);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/univamu/sorting/Sorter.java b/src/main/java/fr/univamu/sorting/Sorter.java
index 9412c7dab07019ab358ec9668667271b29ac3381..2249803d48aaeb845b825cf8864a1083782766d2 100644
--- a/src/main/java/fr/univamu/sorting/Sorter.java
+++ b/src/main/java/fr/univamu/sorting/Sorter.java
@@ -1,7 +1,7 @@
 package fr.univamu.sorting;
 
-public interface Sorter {
+public interface Sorter<T extends Comparable<T>> {
 
     void sort();
-    Sortable getSortable();
+    Sortable<T> getSortable();
 }
diff --git a/src/test/java/fr/univamu/sorting/ListSortTest.java b/src/test/java/fr/univamu/sorting/ListSortTest.java
index a5b6dbfdf24230a9b9792e9eaa812922abb79e1f..0591e40b7709a4d98a1eeaf6ddb920838c21dfbf 100644
--- a/src/test/java/fr/univamu/sorting/ListSortTest.java
+++ b/src/test/java/fr/univamu/sorting/ListSortTest.java
@@ -11,19 +11,25 @@ class ListSortTest {
 
 
   @Test
-  void testSort() {
+  void testQuickSort() {
     List<Integer> values = new ArrayList<>(List.of(2,0,28,15,88,1,61));
     System.out.println(values);
     // List<Integer> values = IntLists.shuffledRange(1,100);
-    Sortable sortableValues = new SortableIntList(values);
-    QuickSort sorter = new QuickSort(sortableValues);
+    Sortable<Integer> sortableValues = new SortableIntList<>(values);
+    //CountingSortable<Integer> countingSortable = new CountingSortable<>(sortableValues);
+    CountingSortable<Integer> countingSortable = new CountingSortable<>(sortableValues);
+    LoggingSortable<Integer> loggingSortable = new LoggingSortable<>(sortableValues);
+    QuickSort<Integer> sorter = new QuickSort<Integer>(countingSortable);
     sorter.sort();
 
-    Sortable sorterSortableValues = sorter.getSortable();
+    Sortable<Integer> sorterSortableValues = sorter.getSortable();
 
     //List<Integer> sortedList = IntStream.rangeClosed(1,100).boxed().toList();
 
     System.out.println(sorterSortableValues.getSortableParameter());
+    System.out.println("nombreSwaps: "+countingSortable.getCountingSwaps());
+    System.out.println("nombreCompare: "+countingSortable.getCountingCompare());
+    System.out.println(loggingSortable.getLogStream());
 
   }
 
@@ -32,11 +38,11 @@ class ListSortTest {
     List<Integer> values = new ArrayList<>(List.of(2,0,28,15,88,1,61));
     System.out.println(values);
     // List<Integer> values = IntLists.shuffledRange(1,100);
-    Sortable sortableValues = new SortableIntList(values);
-    InsertionSort sorter = new InsertionSort(sortableValues);
+    Sortable<Integer> sortableValues = new SortableIntList<>(values);
+    InsertionSort<Integer> sorter = new InsertionSort<>(sortableValues);
     sorter.sort();
 
-    Sortable sorterSortableValues = sorter.getSortable();
+    Sortable<Integer> sorterSortableValues = sorter.getSortable();
 
     //List<Integer> sortedList = IntStream.rangeClosed(1,100).boxed().toList();