merge sort
//recursive merge sort
public static void mergeSort(int[] a){
mergeSort(a, 0, a.length-1);
}
private static void mergeSort(int[] a, int i, int j){
if (i == j)
return;
int mid = (i + j)/2;
mergeSort(a, i, mid);
mergeSort(a, mid + 1, j);
merge(a, i, j);
}
private static void merge(int[] a, int i, int j){
int[] temp = new int[j - i + 1];
int mid = (i + j)/2;
int left = i, right = mid + 1, k = 0;
while (left <= mid && right <= j && k < temp.length){
if (a[left] < a[right])
temp[k++] = a[left++];
else
temp[k++] = a[right++];
}
while (left <= mid)
temp[k++] = a[left++];
while (right <= j)
temp[k++] = a[right++];
for (int m = 0; m < temp.length; m++)
a[i + m] = temp[m];
}