博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2_7 递归与分治策略(合并排序)
阅读量:6415 次
发布时间:2019-06-23

本文共 1514 字,大约阅读时间需要 5 分钟。

合并排序有在大二的《数据结构》课中出现过。

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

将他的简化得到如下:

(图片引自上述博客)

简言之,就是利用分治的思想将数组划分为(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泛型的博客。

转载于:https://www.cnblogs.com/woyaodangxueba/p/10453902.html

你可能感兴趣的文章
CSS滤镜及渐变 (filter样式表属性)
查看>>
调用上面的@InitBinder 解决客户端上传时间参数转换的问题
查看>>
net.sf.json.JSONException: There is a cycle in the hierarchy异常,解决方法
查看>>
Android自动化测试方向
查看>>
QT中常用数据之间转换
查看>>
向量的内积,长度,正交性
查看>>
app包中的fragment和v4包中的fragment的使用的区别
查看>>
Http协议与缓存
查看>>
监测超过特定内存阀值进程并结束
查看>>
Linux Centos 查询信息
查看>>
android adb命令
查看>>
python “双”稀疏矩阵转换为最小联通量“单”矩阵
查看>>
揭秘天猫双11背后:20万商家600万张海报,背后只有一个鹿班
查看>>
重置mysq root密码脚本
查看>>
我的友情链接
查看>>
MHA配置参数
查看>>
深入理解Lock
查看>>
vim的块选择
查看>>
HTML --块
查看>>
在DLL中获取主进程窗口句柄
查看>>