2_7 递归与分治策略(合并排序)

合并排序有在大二的《数据结构》课中出现过。这篇博客讲的很详细。

上面这个人的博客讲的非常的好,如果有打算看博客的可以经常关注。

将他的简化得到如下:

(图片引自上述博客)

简言之,就是利用分治的思想将数组划分为(n/log n)段(log n为划分层次),然后合并多个有序数组。

上代码:

  

 1 public class a_2_7 <T extends Comparable>{
 2     /*
 3     *  对数组进行划分
 4     * */
 5     public static<T extends Comparable> void divide(T a[],int left,int right){
 6         /* 2、如果数组无法划分了就直接返回*/
 7         if(a==null||left>=right) return ;
 8 
 9         /* 1、对数组进行划分,依据mid进行划分*/
10         int mid=(left+right)/2;
11         divide(a,left,mid);
12         divide(a,mid+1,right);
13 
14         /* 3、对数组进行合并*/
15         merge(a,left,mid,right);
16         /* 8、合并完成*/
17     }
18 
19     public static<T extends Comparable> void merge(T [] a, int left, int mid, int right) {
20 
21         /* 4、新建临时存储区*/
22         Object []temp=new Object[right-left+1];
23         int i=left,j=mid+1,k=0;
24 
25         /* 5、将当前分段的左右两边进行合并*/
26         while(i<=mid&&j<=right){
27             if(a[i].compareTo(a[j])<=0)temp[k++]=a[i++];
28             else temp[k++]=a[j++];
29         }
30 
31         /* 6、合并剩余未合并完成的段*/
32         while(i<=mid)temp[k++]=a[i++];
33         while(j<=right)temp[k++]=a[j++];
34 
35         /* 7、将临时存储区的内容复制到原始数组中*/
36         k=0;
37         for(Object o : temp){
38             a[k+left]=(T)temp[k];
39             k++;
40         }
41     }
42     public static void main(String []args){
43         Integer []a=new Integer[100];
44         for(int i=0;i<a.length;++i)a[i]=100-i;
45         for(Integer i : a) System.out.print(i+" ");
46         System.out.println();
47         divide(a,0,a.length-1);
48         for(Integer i : a) System.out.print(i+" ");
49     }
50 }

运行结果如下:

上述代码注释基本描述清楚了内容。

在写这几次的代码过程中,发现了一个问题,自己的Java内容忘得差不多了,而且泛型接触的很少,后面再做Java泛型的博客。

猜你喜欢

转载自www.cnblogs.com/woyaodangxueba/p/10453902.html