归并排序-java

排序-归并排序

基本思想:是指将两个或两个以上的有序表合并成一个新的有序表。

具体步骤: 

(1首先将整个表看成是n个有序子表,每个子表的长度为1。

(2)然后两两归并,得到n/2个长度为2的有序子表。

(3)然后再两两归并,直至得到一个长度为n的有序表为止。

平均时间:O(nlogn)

最好情况:O(nlogn)

最坏情况:O(n2)

辅助空间:O(n)

稳定性:稳定

适用场景:n比较大时

代码实现:

 1   public static void mergeSort(int[] list) {
 2         mergeSort(list, 0, list.length - 1);
 3     }
 4 
 5     private static void mergeSort(int[] list, int left, int right) {
 6         if (left >= right)
 7             return;
 8         int center = (left + right) / 2;
 9         mergeSort(list, left, center);
10         mergeSort(list, center + 1, right);
11         merge(list, left, center, right);
12     }
13 
14     private static void merge(int[] list, int left, int center, int right) {
15         int[] tmpList = new int[list.length];
16         int mid = center + 1;
17         int k = left;
18         int tmp = left;
19         while (left <= center && mid <= right) {
20             if (list[left] <= list[mid])
21                 tmpList[k++] = list[left++];
22             else {
23                 tmpList[k++] = list[mid++];
24             }
25         }
26 
27         while (left <= center) {
28             tmpList[k++] = list[left++];
29         }
30         while (mid <= right) {
31             tmpList[k++] = list[mid++];
32         }
33         // 将临时数组中的数据保存至原数组中
34         while (tmp <= right) {
35             list[tmp] = tmpList[tmp++];
36         }
37     }
原文地址:https://www.cnblogs.com/yang--yang/p/4856077.html