基本思想:分治,合二为一
基本流程:1、确定分界点mid 2、对左右两边分别排序 3、归并
时间复杂度:O(nlogn)
空间复杂度:O(n)
private static int[] mergeSort(int[] arr, int left, int right) {
if(left == right) return arr;
int mid = left + right >> 1;
//分割,对左右两边排序
arr = mergeSort(arr, left, mid);
arr = mergeSort(arr, mid + 1, right);
//合并
int[] res = new int[right - left + 1];
int k = 0;
int i = left, j = mid + 1;
while(i <= mid && j <= right) {
if (arr[i] <= arr[j]) res[k++] = arr[i++];
else res[k++] = res[j++];
}
while (i <= mid) {
res[k++] = arr[i++];
}
while (j <= right) {
res[k++] = arr[j++];
}
// 根据归并后的数组重新赋值排序后的数组
for (i = left, j = 0; i <= right; i++, j++) {
arr[i] = res[j];
}
return arr;
}