排序算法一归并排序

归并排序(Merge Sort)

平均时间复杂度: O( n log n)

空间复杂度: O(n)

稳定性:稳定

基本思想

将一个整体的数组被分解成以数组中单一元素为基本单位的多区域集合,

此时,在每个单一区域中设置两个引用(左引用L与右引用R),利用两个引用,使得每个单一数组中的元素变为有序。

最后执行merge方法(融合),使得左右两边有序的两个单一区域进行合并,合并的过程是简单的递推过程。

 1 public static void mergeSort(int[] arr, int begin, int end) {
 2         int len = arr.length;
 3         int mid = (begin + end) / 2;
 4         if (begin < end) {
 5             //
 6             mergeSort(arr, begin, mid);//左边有序
 7             mergeSort(arr, mid + 1, end);//右边有序
 8             //
 9             merge(arr, begin, mid, end);
10         }
11     }
12 
13     private static void merge(int[] arr, int begin, int mid, int end) {
14         //临时数组,储存排序后的数组片段
15         int[] temp = new int[end - begin + 1];
16         // i代表左边数组的第一个元素
17         // j代表右边数组的第一个元素
18         // k代表临时数组的角标
19         int i = begin, j = mid + 1, k = 0;
20 
21         //将两个数组排序放入临时数组
22         while (i <= mid && j <= end) {
23             if (arr[i] < arr[j]) {
24                 temp[k++] = arr[i++];
25             } else {
26                 temp[k++] = arr[j++];
27             }
28         }
29         //如果左边为排完,右边排完
30         while (i <= mid) temp[k++] = arr[i++];
31         //如果右边为排完,左边排完
32         while (j <= end) temp[k++] = arr[j++];
33         for (int l = 0; l < temp.length; l++) {
34             arr[begin++] = temp[l];
35         }
36     }

猜你喜欢

转载自www.cnblogs.com/loveer/p/11265865.html