二路归并排序java实现

二路归并排序:
其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题。即所谓“分而治之,万流归一”


二路归并排序的时间复杂度计算如下:

参考资料:算法导论------递归算法的时间复杂度求解

二路归并java实现:

 1 public class MergeSort {
 2     
 3     public static void main(String[] args) {
 4         int [] array = {1,8,6,7,2,4,11,17,6,48,3};
 5         //int [] array ={9,8,7,6,5,4,3,2,1};
 6         int [] temp = new int [array.length];
 7         sort(array, temp, 0, array.length - 1);
 8         System.out.println("排序后:");
 9         for (int i = 0; i < array.length; i++) {
10             System.out.print(array[i] + " ");
11         }
12     }
13     /**
14      * 总的sort循环。先将问题一分为二,再将问题解决后的两个子问题结果合并
15      * 要想清楚 子数组 边界的处理。
16      * 如子数组为 下标为(k,k + 1):则再分解为(K),(K+1)。
17      * 如子数组下标为(k,k+1,k+2):则分解为(k,k+1)和(k+2)。再递归调用分解(k,k+1)
18      * @param array
19      * @param temp
20      * @param start
21      * @param end
22      */
23     public static void sort (int [] array, int [] temp, int start, int end){
24         if (start < end) {
25             int mid = (start + end)/2;
26             //解决左边子问题
27             sort(array, temp, start, mid);
28             //解决右边子问题
29             sort(array, temp, mid + 1, end);
30             //合并两个子问题
31             merge(array,temp,start,end,mid);
32         }
33     }
34     /**
35      * 归并函数
36      * @param array 原始数组
37      * @param temp 辅助数组
38      * @param start 归并开始坐标
39      * @param end 归并结束坐标
40      * @param mid = (start + end)/2
41      */
42     public static void merge(int[] array, int[] temp, int start, int end, int mid) {
43         // TODO Auto-generated method stub
44         //i:左子问题的操作下标; j:右子问题的操作下标
45         int i = start;
46         int j = mid + 1;
47         int k = start;
48         while (i <= mid && j <= end){
49             if (array[i] < array[j]) {
50                 temp[k] = array[i];
51                 k++;
52                 i++;
53             }else {
54                 temp[k] = array[j];
55                 k++;
56                 j++;
57             }
58         }    
59         //左子数组还有元素
60         while (i <= mid){
61             temp[k] = array[i];
62             k++;
63             i++;
64         }
65         //右子数字还是元素
66         while (j <= end){
67             temp[k] = array[j];
68             k++;
69             j++;
70         }
71 
72         //将辅助数组中排好序的元素复制到原数组
73         //注意:辅助数组与原数组一一对应
74         for (int index = start; index <= end; index ++){
75             array[index] = temp[index];
76             System.out.println("temp[" + index +"]" + "....." + temp[index]);
77         }
78         System.out.println("===============");
79     }
80 }

猜你喜欢

转载自www.cnblogs.com/wtting/p/8970455.html