相关特点

  • 时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlogn)
  • 辅助空间复杂度为O(n)
  • 稳定
  • 顺序存储与链表存储均可

基本思想

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

算法描述

分而治之(divide - conquer);每个递归过程涉及三个步骤

  • 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.
  • 治理: 对每个子序列分别调用归并排序MergeSort, 进行递归操作
  • 合并: 合并两个排好序的子序列,生成排序结果.

合并图解:

代码实现

package JBSort;
public class MergeSort {/*** 归并排序递归实现* @param a* @param left* @param right*/public void mergeSort(int[] a,int left,int right){if(left<right){int middle = (left+right)/2;//分解mergeSort(a, left, middle);//治理mergeSort(a,middle+1,right);merge(a,left,middle,right);//合并}}/*** 合并* @param a* @param left* @param middle* @param right*/private void merge(int[] a, int left, int middle, int right) {int [] tmpArray = new int[a.length];int rightStart = middle+1;int tmp = left;int third = left;//比较两个小数组相应下标位置的数组大小,小的先放进新数组while(left<=middle&&rightStart<=right){if(a[left]<=a[rightStart]){tmpArray[third++] = a [left++];}else{tmpArray[third++] = a[rightStart++];}}//如果左边还有数据需要拷贝,把左边数组剩下的拷贝到新数组while(left<=middle){tmpArray[third++] = a[left++];}//如果右边还有数据......while(rightStart<=right){tmpArray[third++] = a[rightStart++];}while(tmp<=right){a[tmp] = tmpArray[tmp++];}}public static void main(String[] args){MergeSort mergeSort = new MergeSort();int [] a = new int[]{90,3,2,67,44,-9,87,65,11,9,2,8};mergeSort.mergeSort(a, 0, a.length-1);for(int n:a){System.out.print(" "+n);}}
}

归并算法Java实现相关推荐

  1. 归并算法(Java)

    归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法. 把长度为n的输入序列分成两个长度为n/2的子序列: 对这两个子序列分别采用归并排序: 将两个排序好的子序列合并成一 ...

  2. java实现归并算法

    这个程序不是我原创的,是我在学习别人的程序上改的,想重新写出来的原因就是:作为用户我调用一个工具,我给你个数组,你给我个排好的数组就好了,还要输入起始点和终点显得很不智能.(其实我就是把一行代码封装到 ...

  3. 基于Fork/Join框架实现对大型浮点数数组排序(归并算法和插入排序算法)

    分支/合并框架 说明 重点是那个浮点数数组排序的例子,从主函数展开,根据序号看 1.GitHub代码欢迎star.你们轻轻的一点,对我鼓励特大,我有一个习惯,看完别人的文章是会点赞的. 2.个人认为学 ...

  4. 由归并算法引申出来的其他问题

    前言: 上一节刚讲过归并算法是排序算法中比较少见的一种时间复杂度为:θ(nlgn)的算法.而归并算法之所以快的原因在于它用了分治的思想,现实生活中有很多需要用到分治思想解决的问题,下面就举两个例子. ...

  5. 基于Fork/Join框架实现对大型浮点数数组排序(归并算法和插入排序算法) 1

    分支/合并框架 说明 重点是那个浮点数数组排序的例子,从主函数展开,根据序号看 1.GitHub代码欢迎star.你们轻轻的一点,对我鼓励特大,我有一个习惯,看完别人的文章是会点赞的. 2.个人认为学 ...

  6. 视频教程-尹成老师带你学算法-Java

    尹成老师带你学算法 毕业于清华大学,曾担任Google算法工程师,微软区块链领域全球最具价值专家,微软Tech Ed 大会金牌讲师. 精通C/ C++,Python ,Go语言,Sicikit-Lea ...

  7. [HIT-DB-Lab3] 数据库的多路归并算法及其实现

    HIT战德臣老师的数据库lab3, 目的是用代码实现一个两阶段多路归并算法, 处理数据, 具体要求如下 目的 思路 先看看ppt上有关内容: 两趟多路归并算法其实不难理解, 如果你的内存足够大, 你可 ...

  8. python归并算法_python归并算法

    python数据结构与算法总结 python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构 ...

  9. java实现一个感知机_感知机学习算法Java实现

    感知机学习算法Java实现. Perceptron类用于实现感知机, 其中的perceptronOriginal()方法用于实现感知机学习算法的原始形式: perceptronAnother()方法用 ...

  10. 推特雪花算法 java实现

    2019独角兽企业重金招聘Python工程师标准>>> package twiter.snowflake;/*** twitter的snowflake算法 -- java实现*/ p ...

最新文章

  1. spring31-2: 事务控制
  2. 找工作这几天遇到的骗人套路
  3. 面试奇葩——交换两变量值的一些邪门歪道
  4. java bmp rgb数组_将RGB数据写入BMP位图文件
  5. android cpu绑核
  6. Android 应用程序发布流程---碗豆荚发布流程
  7. cisco switch configuration
  8. 解决MySQL数据库中文模糊检索问题
  9. 信息学奥赛C++语言:打擂台
  10. unity发布Android按钮灰色,Unity3d应用中的Android菜单按钮
  11. 大佬怼国产特斯拉:将必遭这款车型碾压
  12. [转]NS2上实现一个简单的路由协议
  13. 十大物流仿真软件汇总
  14. finereport9.0破解版|finereport10.0破解并发数|finereport授权注册|FineBI5.0破解lic
  15. ubuntu 显示网速 16 18 20 都可以
  16. zkLedger: Privacy-Preserving Auditing for Distributed Ledgers
  17. 堆米微信H5页面怎么制作?易企秀微信H5页面制作,微信简历制作,
  18. 【算法】求n的m次方(快速幂取模)
  19. 2022年的5G行业:“5G+”很火,5G网络迟迟未能普及
  20. python pandas多条件筛选

热门文章

  1. python下载网易云音乐中某个歌单中的全部音乐
  2. windows11彻底关闭Microsoft Defender 安装注册机
  3. 施乐服务器装系统闪EE,施乐7535755633755575驱动安装教程
  4. ivitamin studio_151002 by vitamin studio
  5. 数字化图书馆软硬件环境要求-转自《博奥智源》
  6. 计算机技术与电气工程专业代码,电气工程及其自动化专业代码:080601 [本科]
  7. 用服务器日志监控软件、服务器日志分析工具软件教你如何查看服务器日志?
  8. 38个免费匿名临时邮箱服务
  9. 如何获取京东Cookie
  10. 软件测试你的简历是这样的吗?