归并排序是由冯诺依曼首次提出,该算法采取的是分而治之(Divide and Conquer)的思想,速度仅次于快速排序且为稳定算法,适合的排序情况为总体无序,而各子集相对有序。

原理:其思想就是分而治之,具体来讲就是把原序列不断分解为子序列,直到子序列只有一个元素为止,然后再将各个子序列进行有序归并直到序列数为一。

从上图就可以看出归并算法的流程:

  1. 将原始序列分为2个子序列
  2. 再将2个子序列分成4个子序列
  3. 直到每个子序列中只有1个元素
  4. 然后进行归并操作,并排序,不断重复直到只有一个序列为止

代码实现

#递归实现
def merge(left,right,s): #传入左序列和右序列还有原序列i = j = 0while i + j < len(s): #原序列的作用为控制循环次数if (j == len(right)) or (i < len(left) and left[i] < right[j]): #如果右边的序列走完了或左边的序列[i]的值小于右边序列[j]的值 则将左边[i]的值保存到s序列s[i+j] = left[i]i += 1else: #不然将右边序列[j]的值保存到s序列s[i+j] = right[j]j += 1def merge_sort(s): #归并实现n = len(s) if n < 2: #如果n=1或者n=0则返回returnmid = n // 2 #进行划分left = s[0:mid] right = s[mid:n]merge_sort(left) #这里是递归实现merge_sort(right)merge(left,right,s)if __name__ == '__main__':s = [1,7,4,8,5,9]merge_sort(s)print(s)

时间复杂度分析

首先分析归并算法的递归形式,也就是找出T(n)和n之间的关系,通过上述流程不难得出表达式T(n)=2*T(n/2)+n,2*T(n/2)中的2代表的是有2次这样的操作,而T(n/2)代表的是划分为2个序列,n代表的是最后最多要进行n次比较。写出递归形式之后,利用主定理,这里b = a = 2,f(n) = n = n,根据主定理时间复杂度为o()=o(nlogn)

归并算法Python3.7实现及时间复杂度分析相关推荐

  1. 排序算法 之希尔排序及时间复杂度分析

    排序算法之 冒泡排序及性能优化(时间复杂度+空间复杂度分析) 排序算法之 简单选择排序及时间复杂度分析 排序算法之 直接插入排序及时间复杂度分析 希尔排序 算法思想:将整个待排序列分割成若干个子序列( ...

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

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

  3. 归并排序时间复杂度_一文带你读懂排序算法(四):归并算法

    点击上方蓝字关注我们 归并排序的基本思想核心是分治,就是把一个复杂的问题分成两个或多个相同或相似的子问题,然后把子问题分成更小的子问题,直到子问题可以简单的直接求解,最原问题的解就是子问题解的合并.算 ...

  4. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  5. 算法时间复杂度分析基础

    摘要       本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. ...

  6. 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记

    文章目录 复习梗概 算法思想 算法复杂度分析及稳定性 如何优化? 快速排序改进版代码C++ 快速排序个人青春版代码 完整代码 复习梗概 算法思想,别的排序名字直接就能让人联想到它的算法思想,唯独快速排 ...

  7. 算法时间复杂度分析专题一(帮助快速解题)

    笔试: 题目告诉数据范围,根据题目的数据范围来考虑用什么解法 c++竞赛:一般时限1~2秒 时间范围内指令操作次数<10^8 不同数据范围下,代码时间复杂度和算法该如何选择: n<=30, ...

  8. 算法时间复杂度分析——大O、大Ω、大θ、小o,小ω

    最近开始转战传统算法分析的研究工作了,重新拾起以前学过的一些内容. 目录 一.概述 二.对常见的Ο和Ω进行分析 2.1 大O表示法 2.2 大Ω表示法 三.P问题,NP问题,NP-hard问题,NPC ...

  9. 芯片测试算法及时间复杂度分析

    一.蛮力算法与分治算法 #include <stdio.h> #include <math.h> #define OVERFLOW -2 #define OK 1 #defin ...

最新文章

  1. 纯CSS3进行hover时显示带箭头和动画的tips效果
  2. 数据通信技术(三:VLAN划分)
  3. SEL | 植物通过根系分泌物招募假单孢菌协助抵抗地上部病原菌侵染
  4. python之路--嵌套函数、匿名函数、高阶函数。函数的递归
  5. nginx 负载均衡配置_LINUX系统nginx负载均衡配置
  6. 全flash站制作剖析
  7. java字符串的运用代码_java – 如何使用mockito模拟一个字符串?
  8. php 伪静态是什么意思,路由与伪静态
  9. 蓝桥杯 算法提高 日期计算
  10. 纽约大学计算机工程专业课程,纽约大学计算机工程硕士专业介绍及课程要求
  11. java-工具-开源
  12. 2017中国云计算评测报告
  13. 覆了天下也罢,始终不过一场繁华
  14. 播放html5视频黑屏,播放视频黑屏 · Issue #91 · surmon-china/vue-video-player · GitHub
  15. ireport java 变量_iReport —— 使用 JavaBean 作为数据源
  16. 服务器虚拟主机,非根目录jsp文件的引包报错
  17. mysql中exec语句_SQL语句-exec执行
  18. 瞰见 | 美股新贵Confluent背后的卡夫卡,不是那个魔幻小说家
  19. shell 获取当前目录的路径
  20. Android逆向之旅---应用的反调试方案解析(附加修改IDA调试端口和修改内核信息)

热门文章

  1. metasploit 魔鬼训练营 学习笔记(2) 第四章(web一些漏洞与防止)
  2. 如何利用python在网上接单赚钱,兼职也能月入过万
  3. Python抢票脚本
  4. 三个在电脑上运行很有趣的程序
  5. Ubuntu下官方QQ崩溃的解决
  6. 使用zrender.js绘制体温单(2)
  7. 高性能Linux服务器运维实战(系统基础运维)
  8. Kafka新手入门-000 QuickStart 里面介绍视频的字幕整理
  9. GridView简单使用
  10. cut最后几位 shell_linux的cut命令用法总结