В основном, в ваших счетчиках циклов в merid () methid есть ошибка в этой строке:
if(j == L2.size() || (i < L.size() && C.compare(L1.get(i), L2.get(j)) < 0))
Измените функцию слияния следующим образом:
public static <T> void merge(List<T> L1, List<T> L2,List<T> L, Comparator<T> C){
int i=0;
int j=0;
int k=0;
while(i < L1.size() && j < L2.size()) {
if(C.compare(L1.get(i), L2.get(j)) < 0) {
L.set(k++, L1.get(i++));
}else {
L.set(k++, L2.get(j++));
}
}
while(i < L1.size()) {
L.set(k++, L1.get(i++));
}
while(j < L2.size()) {
L.set(k++, L2.get(j++));
}
}
ОБНОВЛЕНИЕ:
В функции mergeSort также есть несколько ошибок.Измените его следующим образом:
public static <T> void mergeSort(List<T> L, Comparator<T> C){
int size=L.size();
if(size<2){
return;
}
int half=size/2;
List<T> L1=new ArrayList<T>(L.subList(0,half));
List<T> L2=new ArrayList<T>(L.subList(half,size));
mergeSort(L1,C);
mergeSort(L2,C);
merge(L1,L2,L,C);
printList(L);
}
L1 и L2 не были новыми списками массивов в старом коде.Это были всего лишь два указателя, указывающие на те же области памяти, что и в списке L. Поэтому изменение L в функции слияния также изменило L1 и L2.Чтобы решить эту проблему, вам нужно создать два новых подмассива с отдельными выделениями памяти.
Также вы дважды вызывали mergeSort(L1,C);
вместо того, чтобы вызывать его на L1 и L2 каждый.