归并排序属于稳定排序 时间复杂度为O(nlogn)
public static void mergeSort(int[] arr) {
// 创建临时数组
int[] tempArr = new int[arr.length];
// 排序
innerSort(arr, 0, arr.length - 1, tempArr);
}
private static void innerSort(int[] arr, int start, int end, int[] tempArr) {
int mid = (start + end) / 2;
if (start < end) {
// 前半段
innerSort(arr, start, mid, tempArr);
// 后半段
innerSort(arr, mid + 1, end, tempArr);
// merge
mergeArray(arr, start, mid, end, tempArr);
}
}
private static void mergeArray(int[] arr, int start, int mid, int end, int[] tempArr) {
// 前段数组起始index
int i = start;
// 后半段数组起始index
int j = mid + 1;
// 临时数组index
int index = 0;
while (i <= mid && j <= end) {
// 从小到大添加
if (arr[i] < arr[j]) {
tempArr[index++] = arr[i++];
} else {
tempArr[index++] = arr[j++];
}
}
// 合并剩余部分
while (i <= mid) {
tempArr[index++] = arr[i++];
}
while (j <= end) {
tempArr[index++] = arr[j++];
}
index = 0;
// 数据回填
while (start <= end) {
arr[start++] = tempArr[index++];
}
}



