diff --git a/src/main/java/fr/univamu/sorting/Sortable.java b/src/main/java/fr/univamu/sorting/Sortable.java
index e96f6663eb6e7a500dc6b9dcefbfa244840f97d0..1e5865cf28507acfd573bc2598a6e0a5a967f58d 100644
--- a/src/main/java/fr/univamu/sorting/Sortable.java
+++ b/src/main/java/fr/univamu/sorting/Sortable.java
@@ -1,10 +1,19 @@
 package fr.univamu.sorting;
 
+import java.lang.reflect.Array;
 import java.util.List;
 
-public interface Sortable {
-    int get(int index);
+public interface Sortable<T extends Comparable<T>> {
+    T get(int index);
     int size();
     void swap(int index1, int index2);
     int compare(int index1, int index2);
+
+    static <T extends Comparable<T>> Sortable of(List<T> A) {
+        return new SortableIntList(A);
+    }
+
+    static <T extends Comparable<T>> Sortable of(T[] A) {
+        return new SortableIntArray(A);
+    }
 }
diff --git a/src/main/java/fr/univamu/sorting/SortableIntArray.java b/src/main/java/fr/univamu/sorting/SortableIntArray.java
index fa54ebb7cd4e70db071c3b8c5162ef61bf7e11b2..2918e5dae06e4615ce3c6fe6b78f2768dbb297ed 100644
--- a/src/main/java/fr/univamu/sorting/SortableIntArray.java
+++ b/src/main/java/fr/univamu/sorting/SortableIntArray.java
@@ -1,31 +1,31 @@
 package fr.univamu.sorting;
 
-public class SortableIntArray implements Sortable {
-    private int[] Array;
+public class SortableIntArray<T extends Comparable<T>> implements Sortable {
+    private T[] Array;
 
-    public SortableIntArray(int [] Array){
+    public SortableIntArray(T[] Array){
         this.Array=Array;
     }
 
-    public int[] GetArray(){
+    public T[] GetArray(){
         return this.Array;
     }
 
     public int size(){
         return this.Array.length;
     }
-    public int get(int index){
+    public T get(int index){
         return this.Array[index];
     }
     public void swap(int index1, int index2){
-        int a = this.Array[index1];
-        int b = this.Array[index2];
+        T a = this.Array[index1];
+        T b = this.Array[index2];
         this.Array[index1] = b;
         this.Array[index2] = a;
     }
 
     public int compare(int index1, int index2){
-        return this.Array[index1]-this.Array[index2];
+        return this.Array[index1].compareTo(this.Array[index1]);
     }
 
 }
diff --git a/src/main/java/fr/univamu/sorting/SortableIntList.java b/src/main/java/fr/univamu/sorting/SortableIntList.java
index 0e17a63ef3c54d600e43794375c56b21b442e4d0..0925dbfa72942ad2c8d003f4ea53482f1f265f47 100644
--- a/src/main/java/fr/univamu/sorting/SortableIntList.java
+++ b/src/main/java/fr/univamu/sorting/SortableIntList.java
@@ -1,22 +1,19 @@
 package fr.univamu.sorting;
 
-import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
-import java.util.ListIterator;
 
-public class SortableIntList implements Sortable {
-    private List<Integer> list;
+public class SortableIntList<T extends Comparable<T>> implements Sortable {
+    private List<T> list;
 
-    public SortableIntList(List<Integer> list){
+    public SortableIntList(List<T> list){
         this.list = list;
     }
 
-    public List<Integer> GetList(){
+    public List<T> GetList(){
         return this.list;
     }
 
-    public int get(int index){
+    public T get(int index){
         return this.list.get(index);
     }
 
@@ -25,13 +22,13 @@ public class SortableIntList implements Sortable {
     }
 
     public void swap(int index1, int index2){
-        int a = this.list.get(index1);
-        int b = this.list.get(index2);
+        T a = this.list.get(index1);
+        T b = this.list.get(index2);
         this.list.add(index2,a);
         this.list.add(index1,b);
     }
 
     public int compare(int index1, int index2){
-        return this.list.get(index1)-this.list.get(index2);
+        return this.list.get(index1).compareTo(this.list.get(index2));
     }
 }
diff --git a/src/main/java/fr/univamu/sorting/Sorter.java b/src/main/java/fr/univamu/sorting/Sorter.java
new file mode 100644
index 0000000000000000000000000000000000000000..f6016a5f26a6a22d4bb7dc04c9e239477f4aabf8
--- /dev/null
+++ b/src/main/java/fr/univamu/sorting/Sorter.java
@@ -0,0 +1,5 @@
+package fr.univamu.sorting;
+
+public interface Sorter<T extends Comparable<T>> {
+    void sort();
+}
diff --git a/src/main/java/fr/univamu/sorting/insertionSort.java b/src/main/java/fr/univamu/sorting/insertionSort.java
index 4e5a15c4bbf26cd3927a27fa79e7df4269f6d117..65a5ed110359baef9e7b203417064a0e7a0b76f8 100644
--- a/src/main/java/fr/univamu/sorting/insertionSort.java
+++ b/src/main/java/fr/univamu/sorting/insertionSort.java
@@ -1,6 +1,6 @@
 package fr.univamu.sorting;
 
-public class insertionSort {
+public class insertionSort<T extends Comparable<T>> implements Sorter {
     private Sortable Mustsort;
 
     public insertionSort(Sortable Mustsort){
@@ -12,9 +12,16 @@ public class insertionSort {
     }
     public void sort() {
         int i = 0;
-        while (i<Mustsort.size()-1){
-            int x = Mustsort.get(i);
-
+        while (i<this.Mustsort.size()-1){
+            T x = (T) this.Mustsort.get(i);
+            int j = i;
+            while (j>0){
+                while (x.compareTo((T)this.Mustsort.get(j-this.Mustsort.size()))<0){
+                    this.Mustsort.swap(j,j-this.Mustsort.size());
+                    j=j-this.Mustsort.size();
+                }
+            }
+            this.Mustsort.swap(j,i);
         }
     }
 }
diff --git a/src/main/java/fr/univamu/sorting/quicksortSort.java b/src/main/java/fr/univamu/sorting/quicksortSort.java
index 911edab707a8ca11bd91a5d6004f5db3f57ac1d9..cb66a48a9cec7152325a333f0b0932e9a2def8c7 100644
--- a/src/main/java/fr/univamu/sorting/quicksortSort.java
+++ b/src/main/java/fr/univamu/sorting/quicksortSort.java
@@ -2,7 +2,7 @@ package fr.univamu.sorting;
 
 import java.util.List;
 
-public class quicksortSort {
+public class quicksortSort<T extends Comparable<T>> implements Sorter {
     private Sortable Mustsort;
 
     public quicksortSort(Sortable Mustsort){
@@ -13,28 +13,28 @@ public class quicksortSort {
         return this.Mustsort;
     }
 
-    private List<List<Integer>> split(List<Integer> Tosplit){
-        int a = Tosplit.get(Tosplit.size()-1);
-        List<Integer> A = List.of();
-        List<Integer> B = List.of();
-        List<Integer> C = List.of();
-        for(int b : Tosplit){
-            if (a>b){
+    private List<List<T>> split(List<T> Tosplit){
+        T a = Tosplit.get(Tosplit.size()-1);
+        List<T> A = List.of();
+        List<T> B = List.of();
+        List<T> C = List.of();
+        for(T b : Tosplit){
+            if (a.compareTo(b)>0){
                 A.add(b);
             }
-            if (a==b){
+            if (a.compareTo(b)==0){
                 C.add(b);
             }
-            if (a<b){
+            if (a.compareTo(b)<0){
                 B.add(b);
             }
         }
         return List.of(A,C,B);
     }
 
-    private boolean HasRightSize(List<List<Integer>> Tocheck){
+    private boolean HasRightSize(List<List<T>> Tocheck){
         boolean Truth = true;
-        for (List<Integer> L : Tocheck){
+        for (List<T> L : Tocheck){
             if (L.size()>1){
                 Truth = false;
             }
@@ -42,17 +42,17 @@ public class quicksortSort {
         return Truth;
     }
 
-    private List<Integer> Tolist(Sortable S){
+    private List<T> Tolist(Sortable S){
         int A = 0;
-        List<Integer> list = List.of();
+        List<T> list = List.of();
         while (A<S.size()){
-            list.add(S.get(A));
+            list.add((T) S.get(A));
             A=A+1;
         }
         return list;
     }
 
-    private void Change(List<Integer> list){
+    private void Change(List<T> list){
         int A = 0;
         while (A<list.size()){
             int B = 0;
@@ -66,19 +66,19 @@ public class quicksortSort {
         }
     }
     public void sort() {
-        List<Integer> Tosort = Tolist(this.Mustsort);
-        List<List<Integer>> Part = List.of(Tosort);
+        List<T> Tosort = Tolist(this.Mustsort);
+        List<List<T>> Part = List.of(Tosort);
         boolean Issort = false;
         while (Issort == false){
-            List<List<Integer>> Provpart = List.of();
-            for (List<Integer> L : Part){
+            List<List<T>> Provpart = List.of();
+            for (List<T> L : Part){
                 Provpart.addAll(split(L));
             }
             Part=Provpart;
             Issort=HasRightSize(Part);
         }
-        List<Integer> sort=List.of();
-        for (List<Integer> L : Part){
+        List<T> sort=List.of();
+        for (List<T> L : Part){
             sort.addAll(L);
         }
         Change(sort);