合并排序有在大二的《数据结构》课中出现过。
上面这个人的博客讲的非常的好,如果有打算看博客的可以经常关注。
将他的简化得到如下:
(图片引自上述博客)
简言之,就是利用分治的思想将数组划分为(n/log n)段(log n为划分层次),然后合并多个有序数组。
上代码:
1 public class a_2_7{ 2 /* 3 * 对数组进行划分 4 * */ 5 public static 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 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
运行结果如下:
上述代码注释基本描述清楚了内容。
在写这几次的代码过程中,发现了一个问题,自己的Java内容忘得差不多了,而且泛型接触的很少,后面再做Java泛型的博客。