public static List mergeSort(List list, Comparator cmp) {
if (list == null)
return new ArrayList();
if (list.size() <= 1)
return list;
List l1 = left(list); // linke Hälfte
l1 = mergeSort(l1, cmp);
List l2 = right(list); // rechte Hälfte
l2 = mergeSort(l2, cmp);
List result = merge(l1, l2, cmp); // sortierte Hälften mischen
return result;
// Lösung in einer Zeile
// return merge(mergeSort(left(list),cmp),mergeSort(right(list),cmp),cmp);
}
public static List merge(List liste1, List liste2, Comparator cmp) {
int i1 = 0;
int i2 = 0;
List result = new ArrayList();
while (i1 < liste1.size() && i2 < liste2.size()) { // kleineren anfügen
if (cmp.compare(liste1.get(i1), liste2.get(i2)) <= 0)
result.add(liste1.get(i1++));
else
result.add(liste2.get(i2++));
}
// Rest anfügen
while (i1 < liste1.size())
result.add(liste1.get(i1++));
while (i2 < liste2.size())
result.add(liste2.get(i2++));
return result;
}
public static List left(final List list) {
if (list == null || list.size()==0 )
return list;
return list.subList(0, list.size() / 2);
}
public static List right(final List list) {
if (list == null || list.size()==0 )
return list;
return list.subList(list.size() / 2, list.size());
}