import java.util.*;

public class Fusion<T extends Comparable<T>> {


private Queue<T> scinder(Queue<T> file){

Queue<T> moitie = new LinkedList<>();

int taille = file.size()/2;

for(int i=0; i<taille; i++){


moitie.add(file.remove());

}

return moitie;

} 

private Queue<T> fusionner(Queue<T> file1, Queue<T> file2){

Queue<T> fusion = new LinkedList<>();

while(!file1.isEmpty()&&!file2.isEmpty()){

 if (file1.peek().compareTo(file2.peek()) <= 0){

fusion.add(file1.remove());

}

else{

	fusion.add(file2.remove());

}

}

fusion.addAll(file1);
fusion.addAll(file2);

return fusion;



}

private Queue<T> trier(Queue<T> file){

if(file.size()<=1){

	return file;
}

Queue<T> moitie = scinder(file);
Queue<T> gauche = trier(moitie);
Queue<T> droite = trier(file);

return fusionner(gauche,droite);


}

public static void main(String[] args) {
        Queue<Integer> file = new LinkedList<>();
        file.add(5);
        file.add(2);
        file.add(9);
        file.add(1);

        Fusion<Integer> tri = new Fusion<>();
        Queue<Integer> resultat = tri.trier(file);

        System.out.println("File triée : " + resultat);
    }
}


