归并排序

归并排序,是创建在归并操作上的一种有效的排序算法,效率为O(nlogn)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列,归并排序的比较次数小于快速排序的比较次数,移动次数一般多于快速排序的移动次数。

归并操作

归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。

归并排序原理

既然归并排序采用的是分治法,并且依托于归并操作,那么其思想肯定是分而治之。我们知道归并操作是将两个有序的数列合并到一个有序的序列,那么对于一个无序的长序列,可以把它分解为若干个有序的子序列,然后依次进行归并。如果我们说每一个数字都是单独有序的序列,那么只要把原始长序列依次分解,直到每个子序列都只有一个元素的时候,再依次把所有的序列进行归并,直到序列数为1

归并排序的实现方法

递归法

原理如下(假设序列共有n个元素):

  1. 将原始序列从中间分为左、右两个子序列,此时序列数为2
  2. 将左序列和右序列再分别从中间分为左、右两个子序列,此时序列数为4
  3. 重复以上步骤,直到每个子序列都只有一个元素,可认为每一个子序列都是有序的
  4. 最后依次进行归并操作,直到序列数变为1

参考代码

void Merge(int r[],int r1[],int s,int m,int t){ int i=s; int j=m+1; int k=s; while(i<=m&&j<=t) { if(r[i]<=r[j]) r1[k++]=r[i++]; else r1[k++]=r[j++]; } while(i<=m) r1[k++]=r[i++]; while(j<=t) r1[k++]=r[j++]; for(int l=0; l<8; l++) r[l]=r1[l];} void MergeSort(int r[],int r1[],int s,int t){ if(s==t) return; else { int m=(s+t)/2; MergeSort(r,r1,s,m); MergeSort(r,r1,m+1,t); Merge(r,r1,s,m,t); }}

迭代法

原理如下(假设序列共有n个元素):

  1. 将序列每相邻两个数进行归并操作,形成ceil(n/2)个序列,排序后每个序列包含两/一个元素
  2. 将序列每相邻的两个有序子序列进行归并操作,形成ceil(n/4)个序列,每个序列包含四/三个元素
  3. 重复步骤2,直到所有元素排序完毕,即序列数为1个

参考代码

void Merge(int*a,int low,int mid,int high){ inti=low,j=mid+1,k=0; int *temp=(int*)malloc((high-low+1)*sizeof(int)); while(i<=mid&&j<=high) a[i]<=a[j]?(temp[k++]=a[i++]):(temp[k++]=a[j++]); while(i<=mid) temp[k++]=a[i++]; while(j<=high) temp[k++]=a[j++]; memcpy(a+low,temp,(high-low+1)*sizeof(int)); free(temp);}void MergeSort(int*a,int n){ int length; for(length=1; length

归并排序比较次数_归并排序「从入门到放弃」相关推荐

  1. 归并排序执行次数_归并排序过程、时间复杂度分析及改进

    前言 上一篇文章,介绍过第一种基于分治策略的排序算法--快速排序.接下来我们来讨论另一种基于分治策略的排序算法,归并排序.归并排序也被认为是一种时间复杂度最优的算法,我们还是按照基本过程,代码,最坏时 ...

  2. 快速排序比较次数_归并排序「从入门到放弃」

    归并排序 归并排序,是创建在归并操作上的一种有效的排序算法,效率为O(nlogn).1945年由约翰·冯·诺伊曼首次提出.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用 ...

  3. 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...

    简介 上篇[从入门到放弃-Java]并发编程-线程安全中,我们了解到,可以通过加锁机制来保护共享对象,来实现线程安全. synchronized是java提供的一种内置的锁机制.通过synchroni ...

  4. python从零开始到精通_「Python 入门学习指南」0基础小白助你从入门到精通!

    Python比较简单,非常适合初学者入门,内置了各种库,还有丰富的大约13万第三方库,掌握了语法和编程思维后,可以直接使用这些库做出自己的产品.这篇 Python 入门学习指南,针对没有任何编程经验. ...

  5. python嵩天第二版第五章_如何避免从入门到放弃——python小组学习复盘

    2019年春节python学习行动复盘2019-02-09 为了主攻python,没有参加心理学晨读.对心理学也不敢兴趣,怕耽误学习python的时间. 那么没学习心理学的情况下,python学的怎么 ...

  6. 归并排序执行次数_十大排序算法,看这篇就够了

    排序算法分类[1][2] 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以 ...

  7. 归并排序执行次数_肯定能懂的常见算法讲解(1)——排序算法

    我叫水水,很高兴认识大家! 这是专栏的第七篇文章.其实本专题已经在我的公众号(公众号中不只有学习专题,还有很多大学学习资源分享.工具分享等等,文末有相关指路哦,欢迎关注撒~[微信搜索"Cod ...

  8. 归并排序执行次数_一文了解C/C++经典排序算法

    0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序: ...

  9. 归并排序 java实现_归并排序的java实现

    归并排序的优点不说了. 做归并排序之前,我先试着将两个有序数组进行排序,合并成一个有序数组. 思路:定义好两个有序数组,理解的时候我先思考了数组只有一个数组的排序,然后是两个元素的数组的排序,思路就有 ...

最新文章

  1. 用dmidecode - 查看硬件信息
  2. 20155335俞昆 2017-2018-1 《信息安全系统设计》第9周学习总结
  3. Velocity知识点总结
  4. 《C#设计模式》PPT及源码分享
  5. 项目如何用jetty运行_阿里大牛教你如何用Dubbox+SpringBoot+Docker架构,实现双11项目...
  6. 发现在创建云服务器ecs实例的磁盘快照时_玩转ECS第7讲|ECS数据保护-数据备份新特性与最佳实践...
  7. C++中operator的主要用法
  8. python 隐马尔科夫_机器学习算法之——隐马尔可夫(Hidden Markov ModelsHMM)原理及Python实现...
  9. CentOS安装nginx方法命令教程
  10. 兄弟j220怎么清零_兄弟j220怎么清零_兄弟Brother全系列打印机清零大全
  11. 新员工来到项目组的愿景_为您的项目设定愿景
  12. 选择中医 - 虚寒性体质的人吃什么好(萝卜、生姜、地瓜、大蒜)
  13. python将密文解密为明文_三分钟教你学会如何将密文解码成明文
  14. 本地使用Idea创建SpringBoot项目并给gitee托管
  15. 3.2 腾讯云AI解决方案
  16. 诸葛:分析师是如何写好数据研究报告的?
  17. android11obb,exagear安卓11数据包obb合集版
  18. 经营性网站必须要办理ICP增值电信业务经营许可证吗?
  19. centos7 安装 Firefox
  20. Matlab与V-REP联合仿真 | Joint simulation of MATLAB and V-REP

热门文章

  1. redis接口的二次封装
  2. nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
  3. 大剑无锋之素数【面试推荐】
  4. leetcode 767. Reorganize String | 767. 重构字符串(贪心+分桶+26路归并)
  5. CPU缓存一致性协议MESI - 笔记
  6. 【Python】Flask框架系列(三):session和cookie操作、get/post请求、钩子函数
  7. C# 静态方法和属性 图书管理
  8. idea中git分支的使用
  9. hbase建表,删表,修改,查询(get,scan,布隆过滤器)
  10. Linux 安装 MySQL 5.7 并连接 Navicat 详细过程