归并排序简单理解

 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     }
原文地址:https://www.cnblogs.com/interfaceone/p/7838806.html