您的位置:首页 > 其它

算法(三)合并排序

2014-11-02 16:32 127 查看
合并排序要比前面两种排序要稍复杂些。合并排序是在算法中分治思想的一个很好的实例,接下来我们一起来学习合并排序是如何实现的。

首先我先给大家展示一张图:



从上图中我们可以看出,首先我们对一个序列进行分割,直至分到最小单元时,然后对最小的单元进行排序,然后把两个排好序的单元进行合并。此处划分到最小单元就是一个分治算法的体现,如果大家对分治算法不明白的可以去查找相关的资料学习,分治算法是解决问题的一个非常好的办法,有句俗语就是说明了这个道理“大事化小,小事化了”,可见我们的祖先是多么的聪明。接下来直接给大家上代码,如果有问题的可以提出来:
package gzw.pkg1;

/**
* Created by Toplife on 2014/11/2.
*/
public class  Merge
{
//递归分成小部分
public void merge_sort(int[] arrays,int start,int end){
if(start<end){
int m=(start+end)/2;
merge_sort(arrays,start,m);
merge_sort(arrays,m+1,end);
combin_arrays(arrays,start,m,end);
}
}
//合并数组
public void combin_arrays(int[] arrays,int start,int m,int end){
int length=end-start+1;
int temp[]=new int[length];//用来存放比较的数组,用完复制回到原来的数组
int i=start;
int j=m+1;
int c=0;
while(i<=m &&j<=end){
if(arrays[i]<arrays[j]){
temp[c]=arrays[i];
i++;
c++;
}else{
temp[c]=arrays[j];
j++;
c++;
}
}
while(i<=m){
temp[c]=arrays[i];
i++;
}
while(j<=end){
temp[c]=arrays[j];
j++;
}
c=0;
for(int t=start;t<=end;t++,c++){
arrays[t]=temp[c];
}
snp(arrays);
}
//打印数组
public void snp(int[] arrays){
for(int i=0;i<arrays.length;i++){
System.out.print(arrays[i]+" ");
}
System.out.println();
}

public static void main(String[] args)
{
Merge m=new Merge();
int a [] ={8,3,2,9,7,1,5,4};
m.merge_sort(a,0,a.length-1);

}
}




Live as if you were to die tomorrow. Learn as if you were to live forever.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: