public abstract class MergeSort<T extends Comparable<T>> extends Sort<T> {
protected T[] assist;
protected void merge(@NotNull T[] array, int left, int middle, int right) {
int i = left;
int j = middle + 1;
for (int k = left; k <= right; k++) {
assist[k] = array[k];
}
for (int k = left; k <= right; k++) {
if (i > middle) {
array[k] = assist[j++];
} else if (j > right) {
array[k] = assist[i++];
} else if (assist[i].compareTo(assist[j]) <= 0) {
array[k] = assist[i++];
} else {
array[k] = assist[j++];
}
}
}
}
public class Up2DownMergeSort<T extends Comparable<T>> extends MergeSort<T> {
@Override
public void sort(T[] array) {
assist = (T[]) new Comparable[array.length];
sort(array, 0, array.length - 1);
}
private void sort(T[] array, int left, int right) {
if (left >= right) {
return ;
}
int middle = left + (right - left) / 2;
sort(array, left, middle);
sort(array, middle + 1, right);
merge(array, left, middle, right);
}
public static void main(String[] args) {
Sort sort = new Up2DownMergeSort();
Integer[] array = new Integer[]{
1, 3, 2, 4, 4, 9, 10, 3, 3};
sort.sort(array);
System.out.println(Arrays.asList(array));
}
}