图解排序算法(四)之归并排序

基本思想

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

分而治之

可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。

合并相邻有序子序列

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。

代码实现

package sortdemo;import java.util.Arrays;/*** Created by chengxiao on 2016/12/8.*/
public class MergeSort {public static void main(String []args){int []arr = {9,8,7,6,5,4,3,2,1};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int []arr){int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间sort(arr,0,arr.length-1,temp);}private static void sort(int[] arr,int left,int right,int []temp){if(left<right){int mid = (left+right)/2;sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序merge(arr,left,mid,right,temp);//将两个有序子数组合并操作}}private static void merge(int[] arr,int left,int mid,int right,int[] temp){int i = left;//左序列指针int j = mid+1;//右序列指针int t = 0;//临时数组指针while (i<=mid && j<=right){if(arr[i]<=arr[j]){temp[t++] = arr[i++];}else {temp[t++] = arr[j++];}}while(i<=mid){//将左边剩余元素填充进temp中temp[t++] = arr[i++];}while(j<=right){//将右序列剩余元素填充进temp中temp[t++] = arr[j++];}t = 0;//将temp中的元素全部拷贝到原数组中while(left <= right){arr[left++] = temp[t++];}}
}

执行结果

[1, 2, 3, 4, 5, 6, 7, 8, 9]

最后

归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。
java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。

图解排序算法(四)之归并排序相关推荐

  1. 排序算法四:归并排序基本原理以及Python实现

    1. 基本原理 归并排序建立在归并操作上的一种算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.归并排序是将两 个已经有序的序列合成一个有序的序列的过程. 因此,对 ...

  2. 排序算法四:归并排序

    算法思想分而治之:分阶段可以理解为就是递归拆分子序列的过程,治阶段,我们需要将两个已经有序的子序列合并成一个有序序列 public static void mergeSort(int[] arr) { ...

  3. 图解排序算法-归并排序

    基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而 ...

  4. js排序算法详解-归并排序

    js系列教程5-数据结构和算法全解 js排序算法详解-归并排序 归并排序其实可以类比二分法,二分法其实就是二等分的意思,简而言之就是不断和新序列的中间值进行比较.归并排序似乎有异曲同工之妙,什么意思呢 ...

  5. java 排序算法总结,Java排序算法总结之归并排序

    本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...

  6. 3.图解排序算法(三)之堆排序

    作者: dreamcatcher-cx 出处: http://www.cnblogs.com/chengxiao/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位 ...

  7. 排序算法之——二路归并排序

    排序算法之--二路归并排序 二路归并排序的思想: 一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序 开始,我们认为单个数据是有序的,一个数据就是一个段,一次排序之后,两个数据就 ...

  8. 排序算法系列:归并排序算法

    概述 上一篇我们说了一个非常简单的排序算法--选择排序.其复杂程序完全是冒泡级的,甚至比冒泡还要简单.今天要说的是一个相对比较复杂的排序算法--归并排序.复杂的原因不仅在于归并排序分成了两个部分进行解 ...

  9. 排序算法总结之归并排序

    一,归并排序介绍 归并排序是一个典型的基于分治的递归算法.它不断地将原数组分成大小相等的两个子数组(可能相差1),最终当划分的子数组大小为1时(下面代码第17行left小于right不成立时) ,将划 ...

最新文章

  1. python使用textwrap包在已经生成的长字符串中嵌入回车符实战
  2. 机器学习-数据科学库(第六天)
  3. TypeScript class 的参数属性 parameter properties
  4. having vs where
  5. tp5 linux定时,TP5 用cron实现linux定时任务
  6. git的丰富实用经验
  7. 分布式日志收集系统实践(视频教程)
  8. 不为人知的华为和小米真相
  9. java程序的入口点_Java程序的入口点
  10. 一梦江湖获取服务器信息卡住,一梦江湖手游2021年8月6日更新公告
  11. 用友服务器换了ip地址怎么修改,用友服务器ip地址更换
  12. AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第18章:SENDING EMAIL AND TEXT MESSAGES
  13. RelExt: Relation Extraction using Deep Learning approaches for Cybersecurity Knowledge Graph 阅读笔记
  14. 苹果7服务器是什么系统版本,最新系统 iOS14.7 Beta1 版本推出!
  15. opengl绘制位图字体c语言源代码,使用OpenGL位图字体将文本放到屏幕上
  16. TMS320C6678开发笔记---IBL编译与分析3
  17. 嵌入式软件之裸板与驱动调试
  18. 自动跟随机器人教程(六)软件部分 树莓派 声源定位
  19. jenkin设置定时构建及时区修改
  20. 显卡的结构和工作原理及发展历史与现状

热门文章

  1. 国内数十位NLP大佬合作,综述预训练模型的过去、现在与未来
  2. 让机器学会看图说话:Image Caption任务最新综述
  3. 基于知识图谱的问答系统入门—NLPCC2016KBQA数据集
  4. Python数据分析·读取CSV文件转为字典
  5. rust外服组建战队_[新手教程]模组服服务器指令大全(最新版)
  6. 新款苹果手机_苹果宣布新系统 性能依旧“压制quot;安卓
  7. IntelliJ IDEA安装
  8. 佳能打印机 另一台计算机正在使用,多台电脑系统不同如何共享一台佳能打印机的简单设置...
  9. 史上最详细的SSM框架整合(Spring、SpringMVC、Mybatis)
  10. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(九)ID标签