public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
int[] arr = {5, 4, 3, 2, 1};
solution.mergeSort(arr, 0, arr.length-1);
}
private int max = Integer.MAX_VALUE;
private void merge(int[] arr, int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
int[] left = new int[n1 + 1];
int[] right = new int[n2 + 1];
int i;
for (i = 0; i < n1; i++) {
left[i] = arr[p + i];
}
left[i] = max;
for (i = 0; i < n2; i++) {
right[i] = arr[q + i + 1];
}
right[i] = max;
int j = 0;
i = 0;
for (int k = p; k <= r; k++) {
if (left[i] > right[j]) {
arr[k] = right[j];
j++;
} else {
arr[k] = left[i];
i++;
}
}
}
private void mergeSort(int[] arr, int begin, int end) {
int mid;
if (begin < end) {
mid = (begin + end) >> 1;
mergeSort(arr, begin, mid);
mergeSort(arr, mid + 1, end);
merge(arr, begin, mid, end);
}
}
}