import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = new int[]{2,4,1,2,6,7,4,3,3,6,7,3,2,4,5,3,2,23,1,43,2,4,3,22,4,2,-2829};
System.out.println("Before mergeSort: " + Arrays.toString(arr));
mergeSort(arr, 0, arr.length - 1);
System.out.println("After mergeSort: " + Arrays.toString(arr));
}
public static void mergeSort(int[] array, int lo, int hi) {
if (lo == hi) return;
int mid = lo + ((hi - lo) >> 1);
mergeSort(array, lo, mid);
mergeSort(array, mid + 1, hi);
merge(array, lo, mid, hi);
}
public static void merge(int[] array, int lo, int mid, int hi) {
int[] helper = new int[hi - lo + 1];
int index = 0;
int leftPoint = lo, rightPoint = mid + 1;
while (leftPoint <= mid || rightPoint <= hi) {
int leftVal = leftPoint > mid ? Integer.MAX_VALUE : array[leftPoint];
int rightVal = rightPoint > hi ? Integer.MAX_VALUE : array[rightPoint];
helper[index++] = leftVal <= rightVal ? array[leftPoint++] : array[rightPoint++];
}
System.arraycopy(helper, 0, array, lo, hi + 1 - lo);
}
}