import java.util.Arrays; public class MergetSort { public static void main(String[] args) { int[] arr = {8, 4, 5, 7, 1, 3, 6, 2,-9,569}; int[] temp = new int[arr.length]; mergeSort(arr, 0, arr.length - 1, temp); System.out.println(Arrays.toString(arr)); } // 分+合方法 public static void mergeSort(int[] arr, int left, int right, int[] temp) { if (left < right) { //中间索引 int mid = (left + right) / 2; //向左递归进行分解 mergeSort(arr, left, mid, temp); //向右递归进行分解 mergeSort(arr, mid + 1, right, temp); // 合并 merge(arr, left, mid, right, temp); } } // 合并的方法 /** * @param arr 排序的原始数组 * @param left 左边的有序序列的初始索引 * @param mid 中间索引 * @param right 右边的索引 * @param temp 中转数组 */ public static void merge(int[] arr, int left, int mid, int right, int[] temp) { //左边有序序列的初始索引 int i = left; //右边有序序列的初始索引 int j = mid + 1; //指向temp数组的当前索引 int tempInex = 0; // 将两边的有序数据按照规则填充到temp数组,直到有一边处理完毕为止 while (i <= mid && j <= right) { //如果左边数据小,将左边数据放到零时数组填充 if (arr[i] <= arr[j]) { temp[tempInex] = arr[i]; i++; tempInex++; // 反之亦然 } else { temp[tempInex] = arr[j]; j++; tempInex++; } } // 把剩余数据的依次填充到temp while (i <= mid) { temp[tempInex] = arr[i]; i++; tempInex++; } while (j <= right) { temp[tempInex] = arr[j]; j++; tempInex++; } // 将temp数组元素拷贝到arr tempInex = 0; int tempLeft = left; System.out.printf("tempLeft=%d,right=%d\n",tempLeft,right); while (tempLeft <= right) { arr[tempLeft] = temp[tempInex]; tempInex++; tempLeft++; } } }