归并排序法

归并排序法

 

刚学完韩老师的JAVA数据结构与算法课程,先将代码保存在这里

归并排序算法的时间复杂度为nlogn。

 1 package Demo01;
 2 
 3 import java.util.Arrays;
 4 
 5 public class MergeSort {
 6     public static void main(String[] args) {
 7         int[] arr = {0, 4, 5, 7, 1, 3, 6, 2,23,-99};
 8         int[] tmp = new int[arr.length];
 9         mergeSort(arr, 0, arr.length - 1, tmp);
10 
11         System.out.println("归并排序后: " + Arrays.toString(arr));
12     }
13 
14     /**
15      * 合并的过程
16      *
17      * @param arr   需要排序地原始数组
18      * @param left  左边有序序列地初始索引
19      * @param mid   中间索引
20      * @param right 右边索引
21      * @param tmp   作中转的数组
22      */
23     public static void merge(int[] arr, int left, int mid, int right, int[] tmp) {
24         int i = left;           //初始化i,左边有序序列的初始索引
25         int j = mid + 1;        //初始化j,右边有序序列的初始索引
26         int t = 0;              //指向tmp数组的当前索引
27 
28         /**
29          * (一)先把左右两边(有序)的数据按照规则填充到tmp数组
30          * 知道左右两边的有序序列,有一边处理完成为止
31          */
32         while (i <= mid && j <= right) {
33             /**
34              * 如果左边有序序列的当前元素,小于等于右边有序序列的元素
35              * 那么将左边的当前元素拷贝到右边
36              * 然后tmp数组当前所以t要往后移
37              * 反之,就把右边的数据填充到tmp数组中
38              */
39             if (arr[i] <= arr[j]) {
40                 tmp[t] = arr[i];
41                 i++;
42                 t++;
43             } else {
44                 tmp[t] = arr[j];
45                 j++;
46                 t++;
47             }
48         }
49 
50         /**
51          * (二)把有剩余数据的一边的数据依次全部填充到填充到tmp
52          * 1、当左边没做完的时候,把左边剩余元素拷到左边
53          * 2、当右边没做完的时候,把右边的剩余元素考到右边
54          */
55         while (i <= mid) {
56             tmp[t] = arr[i];
57             t++;
58             i++;
59         }
60         while (j <= right) {
61             tmp[t] = arr[j];
62             j++;
63             t++;
64         }
65 
66         /**
67          * (三)将tmp数组拷贝到arr
68          * 注意:并不是每次都是拷所有的
69          */
70         t = 0;
71         int tmpLeft = left;
72         while (tmpLeft <= right) {
73             arr[tmpLeft] = tmp[t];
74             t++;
75             tmpLeft++;
76 
77         }
78     }
79 
80     public static void mergeSort(int[] arr, int left, int right, int[] tmp) {
81         if (left < right) {
82             int mid = (left + right) / 2;
83             mergeSort(arr, left, mid, tmp);         //向左递归分解
84             mergeSort(arr, mid + 1, right, tmp);        //向右递归分解
85             merge(arr,left,mid,right,tmp);          //开始合并
86         }
87     }
88 }

 

 

posted @ 2020-06-11 20:52  IQIUM  阅读(133)  评论(0编辑  收藏  举报