public void mergeSort(int[] arr, int low, int high) {
int mid = (low+high) / 2;
if(low<high) {
mergeSort(arr, low, mid);
mergeSort(arr, mid+1, high);
merge(arr, low, mid, high);
}
}
private void merge(int[] arr, int low, int mid, int high) {
int[] tmp = new int[high - low + 1];
int i = low;
int j = mid + 1;
int k = 0;
while (i<=mid && j<= high){
if(arr[i]<arr[j]){
tmp[k++] = arr[i++];
} else {
tmp[k++] = arr[j++];
}
}
while (i<=mid) {
tmp[k++] = arr[i++];
}
while (j<= high) {
tmp[k++] = arr[j++];
}
for(int m =0 ; m< tmp.length; m++){
arr[m+low] = tmp[m];
}
}
描述:说白了就是把一个N的问题不断分解最后变成一个二叉树,然后从二叉树底层向上递归。每一层都时间都是n,层高为lgn所以时间复杂度为O(nlogn)