二路归并排序的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),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...
随机推荐
- Codeforces 914D Bash and a Tough Math Puzzle (ZKW线段树)
题目链接 Round #458 (Div. 1 + Div. 2, combined) Problem D 题意 给定一个序列,两种询问:单点修改,询问某个区间能否通过改变最多一个数使得该区间的 ...
- KMP【UVA1328】 Period
Description 如果一个字符串S是由一个字符串T重复K次形成的,则称T是S的循环节.使K最大的字符串T称为S的最小循环节,此时的K称为最大循环次数. 现给一个给定长度为N的字符串S,对S的每一 ...
- Ubuntu 16.04没有/etc/default/rcS文件的UTC设置选项的问题解决
继续上一篇文章介绍了CentOS的时钟设置:http://www.cnblogs.com/EasonJim/p/8111747.html,大致的知道了BIOS在Linux的时区设置. 而现在关心的问题 ...
- Memcache的mutex设计模式 -- 高并发解决方案
场景 Mutex主要用于有大量并发访问并存在cache过期的场合,如 首页top 10, 由数据库加载到memcache缓存n分钟: 微博中名人的content cache, 一旦不存在会大量请求不能 ...
- sql 分组后按时间降序排列再取出每组的第一条记录
原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记 ...
- mysql关于数据量大的时候分页分批处理
前几天遇到一个问题是,数据库一开始有24W是信息,需要取出来,进行下载到excel中.一开始遇到的问题是,excel表格行只有65535条行数,远远不够,有人说了很多其他解决方式,为了快速开发我就直接 ...
- hdu 1283 最简单的计算机
水题. .. import java.util.Scanner; public class Main { static int m1, m2; static int r1, r2, r3; publi ...
- http://www.360doc.com/content/14/0313/17/16070877_360315087.shtml
http://www.360doc.com/content/14/0313/17/16070877_360315087.shtml
- windows curl命令
一.概述 Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令 二.下载 下载地址:https://cu ...
- 2017.6.30 IDEA插件--gsonfomat的安装与使用
参考来自:http://www.cnblogs.com/1024zy/p/6370305.html 1.安装 2.使用 (1)新建一个空类 (2)在空类里按快捷键:alt+s,打开gsonformat ...