基本思想

  归并排序(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)。

转载地址:https://www.cnblogs.com/chengxiao/p/6194356.html

图解排序算法-归并排序相关推荐

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

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide) ...

  2. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...

  3. python排序算法——归并排序(附代码)

    python排序算法 --归并排序 文章目录 python排序算法 --归并排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...

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

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

  5. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  6. 八大排序算法 —— 归并排序

    归并排序 归并算法的理解比较难,是一种区别于插入算法,选择算法和交换算法的一种独特算法,需要逐步理解. 核心思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治( ...

  7. 排序算法 —— 归并排序

    归并排序算法 1.划分问题:把序列分成元素个数尽量相等的两半. 2.递归求解:把两半元素分别排序. 3.合并问题:把两个有序表合并成一个. 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用 ...

  8. 二分归并排序算法_第五篇排序算法|归并排序

    0x01,前言闲叙 最近几年很少看电视了,因为没时间看了,除了偶尔刷刷头条,基本上不会花大块的时间沉迷于电视剧,综艺,这或许就是短视频时代所带来的一些改变吧,我们都会深受其中. 0x02,先看下这篇文 ...

  9. 【算法】排序算法——归并排序

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言        归并排序是分治法在排序问题上的运用,因此为了更好地了解归并排序,首先了解 ...

最新文章

  1. 如何对DevOps数据库进行源代码控制
  2. UITextField常用属性
  3. 华为p4用鸿蒙系统吗_华为mate40是鸿蒙系统吗
  4. xbox虚拟服务器,Xbox One平台真相:原生Win8/虚拟化运行
  5. JavaScript 中 substr 和 substring的区别
  6. 查漏补缺!java主要包括哪几种开发平台
  7. C#自定义规则对比两个集合的对象是否相等
  8. [leetcode]_Climbing Stairs
  9. 缩放浏览器不会换行_深入解析 EventLoop 和浏览器渲染、帧动画、空闲回调的关系...
  10. 嵌入式系统中的FLASH
  11. 微型计算机原理与接口技术第二版答案邹逢兴,清华大学出版社-图书详情-《微型计算机原理与接口技术教学辅导(第2版)》...
  12. 科隆OPTIFLUX2100W/4100C分体式电磁流量计维修
  13. 若依的框架怎么样_若依后台管理框架初识
  14. 浪潮服务器开启虚拟化功能,浪潮服务器-虚拟化解决方案.ppt
  15. 怎样看股市K线图指标之成本均线指标CYC
  16. WKWebView加载txt文档乱码
  17. java cron表达式 每天凌晨两点_Quartz cron表达式(时间表达式)
  18. python抢红包脚本_Python自动抢视频红包,仅供学习!
  19. Android图表控件MPAndroidChart——BarChart实现多列柱状图以及堆积柱状图
  20. 你为什么总是做出错误的选择?

热门文章

  1. python 开课了_解答你学习Python的困惑,《Python小白成长记》开课啦
  2. 九、Python文件
  3. 编译安装库等问题汇总
  4. 犬夜叉觉醒怎么在电脑上玩 犬夜叉觉醒电脑版玩法教程
  5. 小程序 wx.showToast 一闪而过的解决办法
  6. openSUSE 15.0 显卡驱动安装
  7. kivy实现屏幕切换
  8. 权力的游戏手游如何用电脑玩 权力的游戏凛冬将至PC电脑版教程
  9. python十进制小数转二进制_Python实现的十进制小数与二进制小数相互转换功能
  10. 论文笔记(三)《Enhancing the Transferability of Adversarial Attacks through Variance Tuning》