转载请注明出处 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实现的更多相关文章

  1. 二路归并排序java实现

    二路归并排序:其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题.即所谓“分而治之,万流归一” 二路归 ...

  2. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  3. 归并排序(Java)

    选择排序的升级版本归并排序, 归并排序有二路归并,三路归并和多路归并,我这次只分析下二路归并,有机会在分析下别的. 归并排序的思想是这样的: 设数组a中存放了n个数据元素,初始时我们把它们看成是n个长 ...

  4. Java基础(48):归并排序的Java封装含原理,完整可运行,结合VisualGo网站更好理解)

    原理: 归并排序建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序, ...

  5. leecode 归并排序 链表(java)

    写了好久,终于写成了.第一次zai leecode错题,题目质量很高,适合面试,与 1.归并排序是稳定的,在java中 Arrays.sort(a);中对于对象的排序就是归并排序.对于原子类型数据使用 ...

  6. 排序算法入门之归并排序(java实现)

    归并排序是采用分治法的典型应用. 参考<数据结构与算法分析-Java语言描述> 归并排序其实要做两件事: (1)"分解"--将序列每次折半划分. (2)"合并 ...

  7. 归并排序算法-Java实现

    简介: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序 基本思想: 将一个无序数组,利用 ...

  8. 递归-归并排序 思想 JAVA实现

    已知一个数组   15.58.61.75.21.32.89.4.78.83.采用递归实现的归并排序将数组有序. 分治策略:(摘自<算法导论>) 在分治策略中,我们采用递归解决问题 分解:将 ...

  9. 归并排序算法Java实现

    一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...

随机推荐

  1. HDU 4920.Matrix multiplication-矩阵乘法

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  2. string那些事之replace

    /* 用法一: 用str替换指定字符串从起始位置pos开始 长度为为len的字符串 string &replace(size_t pos, size_t len, const string&a ...

  3. Good Bye 2016 A. New Year and Hurry【贪心/做题目每道题花费时间按步长为5等差增长,求剩余时间够做几道题】

    A. New Year and Hurry time limit per test 1 second memory limit per test 256 megabytes input standar ...

  4. spring jpa data笔记

    tomcat启动Maven项目的时候总抛出这样的错误: Error creating bean with name 'org.springframework.boot.autoconfigure.or ...

  5. 1.14(java学习笔记)数组

    假如我们需要用到1000个相同类型的数据,肯定不可能创建1000个变量, 这样既不方便,也不直观,也不便于我们使用.这时就需要用到数组. 一.数组的声明与使用 public class Array { ...

  6. Ubuntu 16.04使用timedatectl进行管理时间(UTC/CST)(服务器/桌面)

    说明:16.04开始,systemd接管了系统之后就不再使用/etc/default/rcS和ntpdate.dpkg-reconfigure tzdata进行时间的管理,所以在这些地方设置是无效的, ...

  7. 理解内存----优化SQL Server内存配置

    http://blog.csdn.net/burgess_liu/article/details/17757655

  8. 利用Yum彻底移除docker

    yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-la ...

  9. util.date.js

    ylbtech-JavaScript-util: util.date.js 日期处理工具 1.A,JS-效果图返回顶部   1.B,JS-Source Code(源代码)返回顶部 1.B.1, m.y ...

  10. BAT文件使程序具有以系统权限运行的效果

    @echo off if "%1" == "h" goto begin mshta vbscript:createobject("wscript.sh ...