- 归并排序一个重要的思想是递归,每次划分成两份,直到不能划分
public static void mergeSort(int[] arr) {
if (arr == null || arr.length < 2) {//数组至少有长度为2
return;
}
mergeSort(arr, 0, arr.length - 1);//开始拆分
}
//递归拆分函数
public static void mergeSort(int[] arr, int l, int r) {
if (l == r) {//递归中止条件,直到只有一个节点
return;
}
//(r+l)/2可能会造成数值越界
int mid = l + ((r - l) >> 1);//l + ((r - l) >> 1 = l+(r-l)/2 = 2l/2+(r-1)/2=(r+l)/2
mergeSort(arr, l, mid);
mergeSort(arr, mid + 1, r);
merge(arr, l, mid, r);//拆分到最后进行合并排序
}
//合并排序
public static void merge(int[] arr, int l, int m, int r) {
int[] help = new int[r - l + 1];//help数组的长度为左边数组长度+右边数组长度