合并排序有在大二的《数据结构》课中出现过。这篇博客讲的很详细。
上面这个人的博客讲的非常的好,如果有打算看博客的可以经常关注。
将他的简化得到如下:
(图片引自上述博客)
简言之,就是利用分治的思想将数组划分为(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泛型的博客。