引言

接下来来分析第一个以O(NlogN)O(NlogN)O(NlogN)最坏情形时间运行的算法——归并排序,它使用的比较次数也几乎是最优的,是递归算法的一个好的实例。

思路

基本操作时合并两个已排序的序列,若将输出放到第3个序列中,则该算法可以通过对输入数据一趟排序来完成。

  • 序列一分为二
  • 子序列递归排序
  • 合并有序子序列

整个流程如下图所示:

其中,最复杂的是合并有序子序列这一步骤。为了简单,我们就拿上图逐层合并中倒数第二步来分析。

合并2,3,4,6和1,5,7,8这两个有序子序列。

我们只需要关注这两个序列的首元素,从中挑选出较小的那一个元素放入辅助数组中。
此步将元素1移出原序列,放入辅助数组。


上图最下方的元素1位于辅助数组中。继续比较,将2放入辅助数组

接下来直接贴一个完整的图:


可以看到当某个子序列变空之后,直接将另一个子序列追加到辅助数组即可。

代码


public static <E extends Comparable<? super E>> void mergeSort(E[] array) {mergeSort(array,0,array.length - 1);
}private static <E extends Comparable<? super E>> void mergeSort(E[] array,int left,int right) {if (left < right) {int mid = left + (right - left) / 2;// (left + right)/2/*** 序列一分为二* mid属于左边的数组,mid+1属于右边的数组*/mergeSort(array,left,mid);//对左子序列排序mergeSort(array,mid + 1,right);//对右子序列排序//优化:如果array[mid]小于array[mid+1],则不需要进行归并了if (array[mid].compareTo(array[mid+1]) < 0) {return;}// 归并// 注意,传入的是mid+1merge(array,left,mid+1,right);}
}/**** @param array* @param left 指向左边数组,左边数组开始位置* @param right 指向右边数组,右边数组开始位置* @param rightEnd 右边数组最后一个元素位置*/
private static <E extends Comparable<? super E>> void merge(E[] array,int left, int right, int rightEnd) {E[] aux = (E[]) new Comparable[array.length];//辅助数组int leftEnd = right - 1;//左边数组最后位置int auxIndex = left;//辅助数组开始位置int num = rightEnd - left + 1;//元素总数while (left <= leftEnd && right <= rightEnd) {//比较两个序列的首元素if (array[left].compareTo(array[right]) <0) {aux[auxIndex++] = array[left++];} else {aux[auxIndex++] = array[right++];}}/*** 拷贝剩下的元素* 以下两个while循环,只有一个会执行*/while (left <= leftEnd) {aux[auxIndex++] = array[left++];}while (right <= rightEnd) {aux[auxIndex++] = array[right++];}//将辅助数组拷贝回原数组,注意是逆序的方式for (int i = 0; i < num; i++,rightEnd --) {array[rightEnd] = aux[rightEnd];}
}

复杂度和稳定性

  • 时间复杂度

原序列长度为N,则细分得最大深度为log⁡N\log NlogN;每一层需要排序的元素为N,则归并排序的时间复杂度为O(Nlog⁡N)O(N\log N)O(NlogN)

  • 稳定性

因为交换元素时,大小相等的情况下可以不交换,所以归并排序是稳定的;

排序算法之——归并排序分析相关推荐

  1. 排序算法之--归并排序(好玩的一个算法o。o)快速入门

    排序算法之--归并排序(好玩的一个算法o.o) 下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存 ...

  2. 山东大学软件学院大二下数据结构课程设计---排序算法的性能分析

    文章目录 一.题目 二.界面图 主界面 比较和移动次数饼图 比较不同表长的对话框 验证稳定性的对话框 课设录屏 三.题目分析 四.基本思路 五.项目结构 1.开发环境 2.结构介绍 3.关键点及难点 ...

  3. 排序算法:归并排序、快速排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...

  4. NOI提高级:排序算法之归并排序、快速排序

    图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...

  5. 排序算法:希尔排序算法实现及分析

    希尔排序算法介绍 希尔排序是D.LShell 与1957年提出来的一种排序算法,在这之前排序算法的时间复杂度都是O(n^2),希尔排序算法是突破这个时间复杂度的第一批算法之一.我们知道直接插入排序算法 ...

  6. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

  7. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

  8. [Alg]排序算法之归并排序

    [Alg]排序算法之归并排序 作者:屎壳郎 miaosg01@163.com 日期:Aug 2021 版次:初版 简介: 归并排序是一类在任何情况下都能保证Nlg⁡(N)N\lg(N)Nlg(N)的排 ...

  9. 【排序算法】归并排序(C语言)

    [排序算法]-- 归并排序(C语言) 目录 一.归并排序的原理 二.两个有序数组排序和合并 1. 原地排序 2. 创建临时空间 二.递归实现 三.非递归实现 1. 实现思路 2. 数组边界问题 3. ...

  10. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序

    简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...

最新文章

  1. 学习笔记之vue根据权限动态添加路由
  2. sql的四种连接 用mysql的语句写_170221、浅谈mysql的SQL的四种连接
  3. 漫画 | 辞职前与老板的最后一次谈话有哪些禁忌?
  4. 在Linux server上建立NAS文件服务器
  5. ajax 提交订单,php-在Woocommerce 3中通过ajax提交并在结帐时创建订单
  6. python常用的日期时间模块
  7. ORA-19573: cannot obtain exclusive enqueue for datafile 1
  8. python 的 购物小程序
  9. Android之手机摇一摇震动刷新(支持ListView、GridView、WebView)并生成我的二维码
  10. php的gd库处理大的图片,PHP的gd库处理图片
  11. 【struts框架】第一节Action-struts基础
  12. 戴尔-EMC将至强Phi服务器与Tesla GPU纳入PowerEdge
  13. linux c语言播放midi,C语言实现--计算MIDI音符的频率
  14. 几款Web服务器性能压力测试工具
  15. k2运营商服务器无响应,【求救】K2提示“等待PPP客户端连接”拨号失败
  16. 遥感水文前景_【充电】学遥感必读的十本专业书
  17. pytz 太平洋时区_使用pytz模块打印所有时区的Python程序
  18. php 获取 拼音,php获取汉字拼音(一)
  19. 每周读书#12 - 秘密
  20. android模拟程序被杀死,Android模拟后台进程被杀

热门文章

  1. php底层深度探索(3) ---Apache启动阶段分析 王泽宾
  2. 趣图图解 SOLID 软件开发原则
  3. java day04【 Idea、方法】
  4. [置顶] Jquery学习总结(二) jquery选择器详解
  5. ODBC数据源的配置方法
  6. 关于unity如何制作mmo
  7. 设计模式(十一):享元模式
  8. blog转到CNBlog了
  9. 从零开始搭建框架SSM+Redis+Mysql(一)之摘要
  10. Hadoop-2.4.1学习之Writable及事实上现