归并排序

归并,指合并,合在一起。归并排序(Merge Sort)是建立在归并操作上的一种排序算法。其主要思想是分而治之。

若将两个有序集合并成一个有序表,称为2-路归并,与之对应的还有多路归并。

怎么分

  • 对于排序最好的情况来讲,就是只有两个元素,这时候比较大小就很简单,但是还是需要比较
  • 如果拆分为左右各一个,无需比较即是有序的。

怎么治

借助一个辅助空数组,把左右两边的数组按照大小比较,按顺序放入辅助数组中即可。

以下面两个有序数组为例:

代码实现

public static  void  mergeSort(int[] arr){if (arr == null || arr.length<2){return;}process(arr,0,arr.length-1);}//分治过程private static void process(int[] arr, int L, int R) {if (L == R) {return;}int mid =L+((R-L)>>1);process(arr,L,mid);process(arr,mid+1,R);//递归merge(arr,L,mid,R);}private static void merge(int[] arr, int L, int M, int R ) {//设置辅助空间int[] help= new int[R-L+1];int i=0;int p1=L;int p2=M+1;//判断两边值是否越界while(p1<=M && p2<R){//当左边的值<右边的值  将左边的值拷贝到help里去//否则将右边的值拷贝到help里去help[i++] =arr[p1] <=arr[p2] ? arr[p1++] : arr[p2++];}//如果p1没有越界,那么将p1剩下的东西全部拷贝到help中去while(p1 <= M){help[i++] =arr[p1++];}//如果p2没有越界,那么将p2剩下的东西全部拷贝到help中去while(p2 <=R){help[i++]=arr[p2++];}for ( i = 0; i <help.length ; i++) {arr[L+i]=help[i];}}

时间复杂度

归并排序方法就是把一组n个数的序列,折半分为两个序列,然后再将这两个序列再分,一直分下去,直到分为n个长度为1的序列。然后两两按大小归并。如此反复,直到最后形成包含n个数的一个数组。

归并排序总时间 = 分解时间 + 子序列排好序时间 + 合并时间

无论每个序列有多少数都是折中分解,所以分解时间是个常数,可以忽略不计,则:

归并排序总时间 = 子序列排好序时间 + 合并时间

假设处理的数据规模大小为 n,运行时间设为:T(n),则T(n) = n,当 n = 1时,T(1) = 1

由于在合并时,两个子序列已经排好序,所以在合并的时候只需要 if 判断即可,所以n个数比较,合并的时间复杂度为 n。

  • 将 n 个数的序列,分为两个 n/2 的序列,则:T(n) = 2T(n/2) + n
  • 将 n/2 个数的序列,分为四个 n/4 的序列,则:T(n) = 4T(n/4) + 2n
  • 将 n/4 个数的序列,分为八个 n/8 的序列,则:T(n) = 8T(n/8) + 3n
  • 将 n/2k 个数的序列,分为2k个 n/2k 的序列,则:T(n) = 2kT(n/2k) + kn

当 T(n/2k) = T(1)时, 即n/2k = 1(此时也是把n分解到只有1个数据的时候),转换为以2为底n的对数:k = log2n,把k带入到T(n)中,得:T(n) = n + nlog2n。

使用大O表示法,去掉常数项 n,省略底数 2,则归并排序的时间复杂度为:O(nlogn)

算法稳定性

从原理分析和代码可以看出,为在合并的时候,如果相等,选择前面的元素到辅助数组,所以归并排序是稳定

排序算法-归并排序详细讲解(MergeSort)相关推荐

  1. 排序算法-归并排序详细图解

    归并排序: 采用了分治策略 就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并的核心思想 将两个有序的数组合并成一个大的有序的数组,通过递归把待排 ...

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

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

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

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

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

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

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

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

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

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

  7. 面试必考排序算法最详细介绍,包含动画演示、大厂真题(每天一遍,面试必过)

    文章目录 前言 六大排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 总结 一图解释所有 关于时间复杂度 关于稳定性 大厂面试真题 前言 不知道大家有没有发现,排序算法的考核在校招 ...

  8. 基础排序算法----归并排序

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

  9. 排序算法-归并排序的时间复杂度分析

    归并排序,其实就是递归+合并. 归并排序将数组取中间分为两部分,两个子数组分别各自再从中间分为两个子数组,一直分下去直到不能再分.分完之后,再按照子数组大小合并为为一个有序数组,然后层层向上合并,直到 ...

  10. 排序算法-归并排序的实现与时间复杂度分析

    归并排序 归并排序是分而治之的排序算法. 划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序. 递归写法 归并排序递 ...

最新文章

  1. 在VS中设置预编译头从而提高编译速度
  2. Science | 基于算法设计疫苗的人工蛋白
  3. Dubbo zookeeper 分布式 集群问题
  4. 区跨链应用 | 区块链创业者不要再骗自己了
  5. override java field_JavaPoet 看这一篇就够了
  6. PHP微信SDK——Zebra-Wechat
  7. OCJP试题分析第一章
  8. 致年轻开发人员的一封信
  9. JS获取元素的offsetTop,offsetLeft等相关属性
  10. 数据挖掘导论学习---1
  11. 华为管理学案例分析_华为案例分析——管理学作业.ppt
  12. 事件clientX、pageX、screenX、offsetX
  13. T100学习笔记 - Genero FGL
  14. 小鲲Python嘎嘎炫~day1.4
  15. 将ACII码转为浮点数
  16. 软件项目管理MOOC(北邮)——第一章测试答案
  17. Python Statsmodels 统计包之 OLS 回归
  18. html游戏让目标人物移动,如何用html5编写鼠标事件与游戏人物移动
  19. 微信php背景音乐,微信公众平台添加背景音乐
  20. 赛博大陆的城镇化思考

热门文章

  1. 制作 Eset Nod32 离线升级包
  2. 计算机毕业设计源码—SpringBoot+Vue宿舍管理系统
  3. uln2003驱动蜂鸣器_电路设计:一种步进电机驱动器ULN2003的应用
  4. 基于matlab的声音个数识别
  5. PC版微信/QQ防撤回工具(支持最新版)
  6. C语言程序设计基础篇
  7. Python爬虫采集网易云音乐热评实战
  8. 简明python教程gitbook_简明Python教程 Byte of Python
  9. html 随机 小游戏代码,html小游戏代码#(精选.)(3页)-原创力文档
  10. CentOS故障排除详解(2): 进程相关