Witam stworzyłem swój kod marge sorta i nie mogę dość dlaczego dubluje mi wartości. Prześledziłem go kilka razy i nie widzę błędu

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class MergeSort <T> implements Sorted<T>{
	private List<T> toSort;
	private Comparator<T> comp; // komparator naturalny zwraca -1 gdy a<b zwraca 0 gdy a==b zwraca 1 gdy a>b
	private CollectingData col; // do zbierania danych chwilowo nie używany
	private ArrayList<T> sorted=new ArrayList<T>();
	
	public MergeSort(String sortType, List<T> toSort,Comparator<T> comp){
			this.toSort=toSort;
			this.comp=comp;
			col=new CollectingData("MergeSort", sortType);
			doMergeSort(0,toSort.size()-1);
	}
	
	private void doMergeSort(int first,int last){
		int center;
		if(first<last){
			center=((first+last)/2);
			doMergeSort(first,center);
			doMergeSort(center+1,last);
			merge(first,center,last);
		}
	}
	
	private void merge(int first, int center, int last){
		int i=first;
		int j=center+1;
		int start=first;
		while(i<=center && j<=last){
			if(comp.compare(toSort.get(i), toSort.get(j))<0){
				sorted.add(start++,toSort.get(i++));
			}
			else{
				sorted.add(start++,toSort.get(j++));
			}
		}
		while (i<=center){
			sorted.add(start++,toSort.get(i++));
		}
	}

	@Override
	public List<T> getSorted() {
		// TODO Auto-generated method stub
		return sorted;
	}
}

metoda do sprawdzania

public class UnitTest {
	public static void main(String args[]){
		MergeSort<Integer> sort;
		ArrayList<Integer> tosort=new ArrayList<>();
		Comparator<Integer> comp=new MyComparator<Integer>();
		int tab[]={8,7,6,5};
		for (Integer i:tab){
			tosort.add(i);
		}
		
		sort=new MergeSort<Integer>("Best",tosort,comp);
		tosort=(ArrayList<Integer>)sort.getSorted(); // tak wiem nadpisuję listę ale to nie wpływa na wynik
		for(Integer i:tosort){
			System.out.println(i);
		}
	}
}

Bardzo dziękuję za pomoc :)