归并排序是将两个已经排序的序列合并成一个序列的操作
  1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2、设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4、重复步骤3直到某一指针到达序列尾
  5、将另一序列剩下的所有元素直接复制到合并序列尾

def merge_sort(data):#不断递归调用自己一直到拆分成成单个元素的时候就返回这个元素,不再拆分了if len(data) == 1:return data#取拆分的中间位置# mid = len(data) // 2mid = len(data) >> 1#拆分过后左右两侧子串left = data[:mid]right = data[mid:]#对拆分过后的左右再拆分 一直到只有一个元素为止#最后一次递归时候ll和lr都会接到一个元素的列表# 最后一次递归之前的ll和rl会接收到排好序的子序列ll = merge_sort(left)rl =merge_sort(right)# 我们对返回的两个拆分结果进行排序后合并再返回正确顺序的子列表# 这里我们调用拎一个函数帮助我们按顺序合并ll和lrreturn merge(ll, rl)#这里接收两个列表
def merge(left, right):# 从两个有顺序的列表里边依次取数据比较后放入result# 每次我们分别拿出两个列表中最小的数比较,把较小的放入resultresult = []while len(left) > 0 and len(right) > 0 :#为了保持稳定性,当遇到相等的时候优先把左侧的数放进结果列表,因为left本来也是大数列中比较靠左的if left[0] <= right[0]:result.append(left.pop(0))else:result.append(right.pop(0))#while循环出来之后 说明其中一个数组没有数据了,我们把另一个数组添加到结果数组后面if left:result += leftif right:result += rightreturn resultif __name__ == '__main__':li = [5, 0, 8, 4, 3, 1, 3, 6, 2, 4]li2 = merge_sort(li)print(li2)

转载于:https://www.cnblogs.com/imlifelong/p/10808014.html

大话算法-排序-归并排序相关推荐

  1. 算法-排序-归并排序

    归并排序 特点:非原址排序,比较排序,时间复杂度O(nlgn) 稳定 // // Created by 许加权 on 2021/6/18. //#include <iostream> vo ...

  2. 排序算法中——归并排序和快速排序

    冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...

  3. 【DS】排序算法之归并排序(Merge Sort)

    一.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作.其归并思想如下: 1)申请空间,使其大小为两个已经 ...

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

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

  5. 看动画学算法之:排序-归并排序

    文章目录 简介 归并排序的例子 归并排序算法思想 归并排序的java实现 归并排序的时间复杂度 简介 归并排序简称Merge sort是一种递归思想的排序算法.这个算法的思路就是将要排序的数组分成很多 ...

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

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

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

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

  8. 排序算法:归并排序算法实现及分析

    归并排序算法介绍 归并排序(Merging Sort)就是利用归并的思想实现排序的放.它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个 ...

  9. 结合内存分析java归并排序_排序算法之归并排序(Mergesort)解析

    一.归并排序的优缺点(pros and cons) 耗费心思来理解它,总要有个理由吧:归并排序的效率达到了巅峰:时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界 归并排序是一种稳 ...

最新文章

  1. 学会这门编程知识,可能决定你能进什么样的企业
  2. ORACLE 12C CDB中PDB参数管理机制
  3. linux—select具体解释
  4. 除了航拍,无人机也许能用于救火救灾
  5. [java8]时间差
  6. 二维数组作为形参的参数传递问题[08-0704]-转
  7. 天天说大数据但不知怎么用?读完这篇你就懂了
  8. 家庭版联想台式计算机,联想台式机预装win10家庭版升级win10专业版方法教程
  9. 2019年java全栈工程师学习大全
  10. linux内核一直输出系统日志,系统日志出现大量:kernel: printk: xxxx messages suppressed...
  11. 当三代测序遇到肿瘤基因组研究
  12. 数据结构学习笔记-常用十大算法
  13. 抖客联盟API如何申请?
  14. 信息化知识-信息与信息化
  15. 基于SSM的心理健康系统
  16. 硬件和软件看门狗的差别
  17. 《程序员的自我修养》读书总结
  18. OpenGL的图形渲染过程
  19. 多人视频相亲交友源码打破传统相亲
  20. 安全终端模拟软件——Xshell

热门文章

  1. Java的synchronized关键字:同步机制总结
  2. 如何设计一门语言(五)——面向对象和消息发送
  3. 20本最好的Linux免费书籍
  4. 数字图像处理:第十五章 图象分割
  5. 编程之美-快速寻找满足条件的两个数方法整理
  6. 技术面试老是有劲使不出,该怎么办?
  7. Win10下MySQL5.7.20 Mysql(64位)解压版安装及bug修复
  8. 使用二次封装的openStack发行版本网卡至少有2个
  9. 创建支持nginx服务的docker镜像
  10. Silverlight C# 游戏开发:Flyer03大图裁剪,高效动画的艺术