1 public static void sort(int[] arr) { 2 int[] temp = new int[arr.length];// 在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间 3 sort(arr, 0, arr.length - 1, temp); 4 } 5 6 private static void sort(int[] arr, int left, int right, int[] temp) { 7 if (left < right) { 8 int mid = (left + right) / 2; 9 sort(arr, left, mid, temp);// 左边归并排序,使得左子序列有序 10 sort(arr, mid + 1, right, temp);// 右边归并排序,使得右子序列有序 11 merge(arr, left, mid, right, temp);// 将两个有序子数组合并操作 12 } 13 } 14 15 private static void merge(int[] arr, int left, int mid, int right, int[] temp) { 16 int i = left;// 左序列指针left到mid 17 int j = mid + 1;// 右序列指针mid+1到right 18 int t = 0;// 临时数组指针 19 while (i <= mid && j <= right) {//合并 20 if (arr[i] <= arr[j]) { 21 temp[t++] = arr[i++]; 22 } else { 23 temp[t++] = arr[j++]; 24 } 25 } 26 while (i <= mid) {// 将左边剩余元素填充进temp中 27 temp[t++] = arr[i++]; 28 } 29 while (j <= right) {// 将右序列剩余元素填充进temp中 30 temp[t++] = arr[j++]; 31 } 32 t = 0; 33 // 将temp中的元素全部拷贝到原数组中 34 while (left <= right) { 35 arr[left++] = temp[t++]; 36 } 37 }