二路归并排序的java实现
转载请注明出处 http://www.cnblogs.com/dongxiao-yang/p/6410775.html
参考引言:在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序;归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数组,直到子数组里面只有一个元素,那么就自然排好序了,可以总结为先排序再递归;归并排序:先什么都不管,把数组分为两个子数组,一直递归把数组划分为两个子数组,直到数组里只有一个元素,这时候才开始排序,让两个数组间排好序,依次按照递归的返回来把两个数组进行排好序,到最后就可以把整个数组排好序;
public class mergesortutil { public static void main(String[] args) {
// TODO Auto-generated method stub int[] a = new int[] { 11,9,7,5,3,1,12,10,8,6,4,2 }; int[] tmp = new int[a.length];
mergesort(a,0,a.length-1,tmp);
} private static void mergearray(int[] array, int start, int middle, int end,int[] tmp) { int first = start;
int second = middle + 1;
int index = start; while ((first <= middle) && (second <= end)) {
if (array[first] >= array[second])
tmp[index++] = array[second++];
else
tmp[index++] = array[first++];
}
while (first <= middle)
tmp[index++] = array[first++];
while (second <= end)
tmp[index++] = array[second++]; for (first = start; first <= end; first++)
array[first] = tmp[first]; System.out.println("merge is "+Arrays.toString(array)); } public static void mergesort(int[] array, int start, int end,int[] tmp) { if (start >= end)
return;
int middle = ((end + start) >> 1);
mergesort(array, start, middle,tmp);// 递归划分左边的数组
mergesort(array, middle + 1, end,tmp);// 递归划分右边的数组
mergearray(array, start, middle, end,tmp);// 对有序的两个数组进行合并成一个有序的数组
} }
程序调试输出如下
merge is [9, 11, 7, 5, 3, 1, 12, 10, 8, 6, 4, 2]
merge is [7, 9, 11, 5, 3, 1, 12, 10, 8, 6, 4, 2]
merge is [7, 9, 11, 3, 5, 1, 12, 10, 8, 6, 4, 2]
merge is [7, 9, 11, 1, 3, 5, 12, 10, 8, 6, 4, 2]
merge is [1, 3, 5, 7, 9, 11, 12, 10, 8, 6, 4, 2]
merge is [1, 3, 5, 7, 9, 11, 10, 12, 8, 6, 4, 2]
merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 6, 4, 2]
merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 4, 6, 2]
merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 2, 4, 6]
merge is [1, 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12]
merge is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
调试过程输出结果有助于更好的理解排序过程,整个排序在数组划分到最小长度后不断进行局部排序和局部合并排序,最终合并为全数组。
参考资料
二路归并排序的java实现的更多相关文章
- 二路归并排序java实现
二路归并排序:其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题.即所谓“分而治之,万流归一” 二路归 ...
- 归并排序算法 java 实现
归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...
- 归并排序(Java)
选择排序的升级版本归并排序, 归并排序有二路归并,三路归并和多路归并,我这次只分析下二路归并,有机会在分析下别的. 归并排序的思想是这样的: 设数组a中存放了n个数据元素,初始时我们把它们看成是n个长 ...
- Java基础(48):归并排序的Java封装含原理,完整可运行,结合VisualGo网站更好理解)
原理: 归并排序建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序, ...
- leecode 归并排序 链表(java)
写了好久,终于写成了.第一次zai leecode错题,题目质量很高,适合面试,与 1.归并排序是稳定的,在java中 Arrays.sort(a);中对于对象的排序就是归并排序.对于原子类型数据使用 ...
- 排序算法入门之归并排序(java实现)
归并排序是采用分治法的典型应用. 参考<数据结构与算法分析-Java语言描述> 归并排序其实要做两件事: (1)"分解"--将序列每次折半划分. (2)"合并 ...
- 归并排序算法-Java实现
简介: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序 基本思想: 将一个无序数组,利用 ...
- 递归-归并排序 思想 JAVA实现
已知一个数组 15.58.61.75.21.32.89.4.78.83.采用递归实现的归并排序将数组有序. 分治策略:(摘自<算法导论>) 在分治策略中,我们采用递归解决问题 分解:将 ...
- 归并排序算法Java实现
一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...
随机推荐
- R 语言词云wordcloud
来源:http://blog.chinaunix.net/uid-25135004-id-4311592.html wordcloud函数--用于绘制词云图 用法: wordcloud(words,f ...
- Python的并发并行[3] -> 进程[0] -> subprocess 模块
subprocess 模块 0 模块描述 / Module Description From subprocess module: """Subprocesses wit ...
- [xsy2724]Tree
题意:给一棵树,找出$k$个点$A_{1\cdots k}$以最小化$\begin{align*}\sum\limits_{i=1}^{k-1}dis_{A_i,A_{i+1}}\end{align* ...
- Oracle数据库任何用户密码都能以sysdba角色登入
* 本文相关环境:Windows 10,64位操作系统:Oracle 11gR2:toad for Oracle12.1 最近在学习Oracle数据库,使用Toad for Oracle来查看数据库的 ...
- tiny4412 串口驱动分析六 --- TTY驱动架构
转载: http://www.linuxidc.com/Linux/2013-11/92639.htm 参考: http://blog.csdn.net/lamdoc/article/details/ ...
- 如何在AutoCAD中将卫星底图变为有坐标参考信息的
这篇博文首先没有图,主要是博主太懒了,不想再截图,我把过程说清楚也可以的.特此说明. (1)将下载好的瓦片拼接好大的地图 (2)将其导入到ArcGIS中,定义其地理坐标,如WGS84:然后将其其投影为 ...
- [置顶]
docker web-GUI DockerUI和Shipyard对比
DockerUI和Shipyard对比 相似 基于Docker API,提供等同Docker命令行的大部分功能,支持container管理,image管理. web页面查看和管理容器和镜像,均能批量管 ...
- QQ-weiyun(微云)-云储存
ylbtech-DatabaseDesgin:QQ-weiyun(微云)-云储存 1.A,数据库关系图(Database Diagram) -- =========================== ...
- 关于各浏览器的cookie上限
IE6~IE6以下,每个域名最多20个cookie IE7及以上,每个域名最多50个cookie Firefox,每个域名最多50个cookie Opera,每个域名最多30个cookie Safar ...
- Git 历险记(三)——创建一个自己的本地仓库
如果我们要把一个项目加入到Git的版本管理中,可以在项目所在的目录用git init命令建立一个空的本地仓库,然后再用git add命令把它们都加入到Git本地仓库的暂存区(stage or inde ...