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

2023-05-16

python排序算法 ——归并排序


文章目录

  • python排序算法 ——归并排序
  • 一、前言
  • 二、算法描述
  • 三、代码实现
  • 总结


一、前言

相关知识来自《python算法设计与分析》。初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒泡排序3种。相比起初级排序算法,高级排序算法往往有更加复杂的逻辑,但也会有更高的时间或空间效率。其中有些高级排序算法是由一些初级排序算法优化而来的。

二、算法描述

本节中的第一种高级排序算法是归并排序。“归并”一词,意为“合并”。顾名思义,归并排序算法就是一个先把数列拆分为子数列,对子数列进行排序后,再把有序的子数列合并为完整的有序数列的算法。它实际上采用了分治的思想。

归并排序的平均时间复杂度是O(nlgn),最好情况下的时间复杂度是O(nlgn),最坏情况下的时间复杂度也是O(nlgn)。它的空间复杂度是O(1)。另外,归并排序还是一个稳定的排序算法。

以升序排序为例,归并算法的流程如图2-21所示。

原始数组是一个有8个数的无序数组。一次操作后,把8个数的数组分成两个4个数组成的无序数组。接下来的每次操作都是把无序数组不停分成两半,直到每个最小的数组里都只有一个元素为止。当数组里只有一个元素时,这个数组必定是有序的。然后,程序开始把小的有序数组每两个合并成为大的有序数组。先是从两个1个数的数组合并成2个数的数组,再到4个数然后8个数。这时,所有的有序数组全部合并完成,最后产生的最长的有序数组就排序完成了。

在这里插入图片描述

三、代码实现

归并排序代码:

  #归并排序
nums = [5,3,6,4,1,2,8,7]
def MergeSort(num):
  if(len(num)<=1):        #递归边界条件
   return num         #到达边界时返回当前的子数组
  mid = int(len(num)/2)      #求出数组的中位数
  llist,rlist = MergeSort(num[:mid]),MergeSort(num[mid:])#调用函数分别为左右数组排序
  result = []
  i,j = 0,0
  while i < len(llist) and j < len(rlist): #while循环用于合并两个有序数组
   if rlist[j]<llist[i]:
     result.append(rlist[j])
     j += 1
   else:
     result.append(llist[i])
     i += 1
  result += llist[i:]+rlist[j:]  #把数组未添加的部分加到结果数组末尾
  return result         #返回已排序的数组
print(MergeSort(nums))

运行程序,输出结果为:

[1,2,3,4,5,6,7,8]

在MergeSort()函数中,首先进行的是边界条件判断。当传入函数的数组长度只有1时,每一个数独立存在于一个数组中,因此数组已经被分到最小。这时候,递归分解数组的任务已经完成,只需要把分解后的数组返回到上一层递归就可以了。

如果未排序数组的长度仍然大于1,那么使用变量mid来存储数组最中间的下标,把未排序数组分成左右两个子数组。然后,新建两个数组,用于存储排好序的左右子数组。这里使用了递归的思想。我们只把MergeSort()函数视为一个为列表排序的函数,尽管在MergeSort()函数内部,也可以调用函数本身对两个子数组进行排序。

随后,使用while循环合并两个已经有序的数组。由于不能确定两个数组中元素的相对大小,所以我们采用i和j两个变量分别标记在左子数组和右子数组中等待加入的元素的位置。当while循环结束时,可能一个子数组的末尾还剩余一些最大的元素没有被添加到result列表中,所以result+=llist[i:]+rlist[j:]语句是为了防止漏掉这些元素。数组合并完成后,函数输出有序数组。


总结

以上就是本文要讲的内容,本文介绍了归并排序的理论知识和代码实现。
归并排序的平均时间复杂度是O(nlgn),最好情况下的时间复杂度是O(nlgn),最坏情况下的时间复杂度也是O(nlgn)。它的空间复杂度是O(1)。另外,归并排序还是一个稳定的排序算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python排序算法——归并排序(附代码) 的相关文章

  • ServletConfig对象讲解

    ServletConfig最大的作用就是在一个servlet项目中 xff0c 有些东西不适合在程序中写死 xff0c 这些个东西就可以通过配置的方式添加到servlet的配置文件web xml中 在servlet的配置文件web xml中
  • spring的xml文件不给提示

    解决方法 xff1a 1 window gt preferences gt myeclipse gt Files and Editors gt xml gt xml Files gt Xml Catalog 或者直接到Preferences
  • Navicat 连接 MySQL 1045 错误

    navicat for mysql 连接本地数据库出现1045错误 如下图 xff1a 查了很多资料 xff0c 意思是说mysql没有授权远程连接 xff0c 也就是权限不够 xff1b 解决方法 xff1a 1 首先打开命令行 xff1
  • 网络编程(一)

    本节主要讲网络编程的一些个概念 计算机网络 把分布在不同地理区域的计算机与专门的外部设备用通信线路互相连成一个规模大 功能强的网络系统 xff0c 从而使众多计算机可以方便的互相传递信息 xff0c 共享硬件 xff0c 软件 数据信息等资
  • 网络编程(二)InetAddress和InetSocketAddress

    本节主要讲InetAddress和InetSocketAddress这两个类 InetAddress 封装计算机的IP地址和DNS xff0c 没有端口 1 静态方法获取对象 InetAddress InetAddress getLocal
  • 网络编程(三)URL爬虫原理

    URL和URI的概念 URI xff08 Uniform resource identifier xff09 统一资源标识符 xff0c 用来唯一的标识一个资源 URL xff08 Uniform resource Locator xff0
  • Android lottie java.lang.IllegalStateException: Missing values for keyframe. 问题解决

    对接lottie时 xff0c 根据Lottie用法 xff0c 加载json xff0c 效果显示不出来 xff0c lottie官网上预览json显示正常 xff0c 大量搜索后 xff0c 发现lottie低版本 xff0c 不适用现
  • 网络编程(四)UDP通信

    UDP 以数据为中心 xff0c 非面向连接 xff0c 不安全数据可能丢失但是效率高 xff0c 例如短信 涉及到的类 DatagramSocket 和 DatagramPacket DatagramSocket 此类表示用来发送和接收数
  • 网络编程(五)Socket通信

    在网络编程 xff08 四 xff09 中学习了udp通信 udp通信是非面向连接的 效率高但不安全的通信 而socket通信是基于tcp协议 xff0c 建立稳定连接的点对点的通信 比如打电话 实时 快速 安全性高 占用系统资源高 效率低
  • 网络编程(六)聊天室代码实现

    先写一个客户端输入数据 xff0c 服务器端处理数据后返回给客户端 客户端 xff1a public static void main String args throws UnknownHostException IOException
  • 设计模式——单例模式

    设计模式包括三大类 创建型模式 xff08 主要用来建立对象 xff09 单例模式 工厂模式 抽象工厂模式 建造者模式 原型模式 结构型模式 适配器模式 桥接模式 装饰模式 组合模式 外观模式 享元模式 代理模式 行为型模式 模板方法模式
  • 破解单例模式

    通过反射和反序列化的手段可以破解几种单例模式 xff08 不包含枚举式 xff09 防止反射破解的方法 xff08 在私有构造方法中手动抛出异常 xff09 防止反序列化的方法 xff08 在所在类定义readreadResolve方法 x
  • 设计模式——工厂模式

    工厂模式 xff1a 实现了创建者和调用者的分离 详细分类 xff1a 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则 xff1a OCP xff08 开闭原则 xff0c Open Closed Principle xf
  • Spring框架jar包的下载方法

    1 登录 xff1a http repo springsource org libs release local org springframework spring 4 2 0 RELEASE 选择自己需要的版本 打开 2 进入上图中选中
  • list添加一个对象的时候抛出NullPointerException

    出现这个问题的原因在于 当你定义了一个List时 xff0c 但是没有new该list xff0c 也没有在无参构造方法中去new该list xff0c 就会抛出空指针异常 例如 xff1a private static List lt U
  • sql语句注意事项

    例子 xff1a select deptno avg sal count from emp where deptno 61 20 group by deptno having count gt 3 having 进行二次筛选 order b
  • Vue指令之V-if篇

    v if见名知意 xff0c 就和我们在java中的if功能类似 java中if xff08 条件成立 xff09 执行语句 只不过Vue中将java中的执行语句换成了标签快中的内容 在v if中 xff0c 也是类似的 v if 61 3
  • 安装SFTP/FTP插件快速编辑远程服务器文件

    默认的Sublime Text 3 是没有sftp ftp功能的 xff0c 如果编辑器自带ftp势必会提高开发效率 xff0c 虽然Sublime Text 3 默认是没有ftp功能 xff0c 但是安装sftp插件很容易 下面是我安装步
  • Vue指令之v-else篇

    讲完v if篇 xff0c 那么接下里我们就说说v else喽 对比java中的if 条件 条件成立执行的语句 else 条件不成立执行的语句 我相信你的脑瓜子已经转了90度 xff0c 已经完全搞明白Vue的v else该怎么用了 没错
  • Vue指令之v-for篇

    现在接着来扯v for指令 v for顾名思义 xff0c 和java中的for指令一个用法 xff0c 该指令用来循环遍历一个数组 v for 指令需要以 site in sites 形式的特殊语法 xff0c sites 是源数据数组并

随机推荐

  • Vue指令之v-on篇

    说到v on就立马事件 xff0c 最典型的的例子就是按钮的事件我们可以用v on监听事件 xff0c 并对用户的输入进行响应 先举个例子 xff0c 上代码 xff1a lt html gt lt head gt lt meta char
  • Vue指令之v-bind篇

    v bind指令 xff0c bind中文意思是捆绑的意思 xff0c 额 xff0c 捆绑 其绑定的参数在v bind 指令中的maohao xff08 冒号 xff09 后指明 xff0c 没错就是我标红的那个冒号 v bind指令被用
  • 5分钟认识JSON

    JSON JavaScript Object Notation JavaScript 对象表示法 什么是Json Json是java script 对象表示式 json是轻量级的文本数据交换格式 json对立于语言 xff1a json使用
  • JS中的const、var和let的区别

    看项目的时候遇到了const和let不知道什么意思 xff0c 特写此博客给记忆力不好的我 1 const定义的变量不可以修改 xff0c 而且补习初始化 xff08 相当于java中的常量 xff09 const a 61 2 正确 a
  • SpringMVC执行的流程

    先通过一个流程图来介绍请求 响应的完整流程 该图是SpringMVC请求响应的完整流程 工作流程如下 xff1a 1 用户向服务器发送请求 xff0c 请求被前端控制器DispatcherServlet截获 2 DispatcherServ
  • SpringMVC之@Controller注解

    Spring从2 5版开始引入注解 xff0c 本文说的是SpringMVC 4版 64 Controller注解 Controller注解用于指示Spring类的实例是一个控制器 xff0c 相对于实现Controller接口变得更加简单
  • SpringMVC之@RequestMapping注解

    RequestMapping xff1a org springframework web bind annotation RequestMapping RequestMapping注解类型用来指示Spring用哪一个类或方法来处理请求动作
  • Model和ModelAndView

    在 64 RequestMapping注解的方法中 xff0c 可出现和返回的参数类型中 xff0c 最重要的就是Model和ModelAndView了 SpringMVC在内部使用了一个Model接口存储模型数据 xff0c 它的功能类似
  • 解决 GTS GtsPermissionTestCases 模块 testPreloadedAppsTargetSdkVersion fail 问题

    报错报告截图 xff1a 解决办法 xff1a 重新生成 release platform shared media 4对签名文件替换 span class token number 1 span 重新替换release platform
  • @RequestParam注解

    在一些业务场景下 xff0c 前端发送请求的属性名称和后端方法接收参数名不相同 xff0c 这时候就要用到 64 RequestParam注解将后端的参数名重命名为前端对应的参数名称 xff01 org springframework we
  • Photoshop安装包破解安装教程

    详细的Photoshop安装包获取及破解安装过程 xff0c 请看大神的链接 https blog csdn net cssavage article details 81508689 本人亲测 xff0c 着实可靠 xff01 xff01
  • MySQL连接查询—自身连接

    若一个查询同时涉及两个表及以上的表 xff0c 则称之为连接查询 连接查询是关系数据库中最主要的查询 xff0c 包括等值连接查询 自然连接查询 非等值连接查询 自身连接查询 外连接查询和复合条件查询等 1 等值于非等值连接查询 连接查询的
  • CSS选择器

    CSS的选择器包括两种 xff1a Id和Class 1 ID选择器 id选择器可以标有特定ID的HTML元素指定特定的样式 HTML元素以ID属性来设置ID选择器 xff0c CSS中ID选择器以 来定义 以下选择器规则应用于元素属性id
  • CSS的创建

    当读到一个样式表时 xff0c 浏览器会根据样式表来美化HTML页面 本文就对插入样式表的三种方法做介绍 xff1a 首先 xff0c 先说一下三种方法为 xff1a 外部样式表 内部样式表 内联样式 1 外部样式表 应用场景 xff1a
  • CSS列表样式

    CSS列表属性作用如下 设置不同的列表项标记为有序列表设置不同的列表项标记为无序列表设置列表项标记为图像 无序列表 xff1a 用特殊图形标记列表项 有序列表 xff1a 用数字或字母标记列表项 CSS列表属性 属性描述list style
  • java虚拟机内存区域详解

    运行时数据区域 java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域 这些区域各自为政 xff0c 有的区域随着虚拟机进程的启动而存在 xff0c 而有些区域的生命周期则依赖于用户线程的生命周期 java虚拟机
  • csdn博客如何设置插入代码段的背景色

    最近在写博客的过程中发现自己插入的代码背景色全是米色的 xff0c 看起来很不爽 xff0c 就想要炫酷黑 经过一番研究 xff0c 终于发现如何设置插入代码段的背景颜色 xff1a 大体操作 xff1a 我的博客 gt 管理博客 gt 博
  • Exception in thread "main" java.lang.AbstractMethodError(Spring boot启动报错)

    具体报错 xff1a Exception in thread 34 main 34 java lang AbstractMethodError org springframework boot context config ConfigFi
  • Unregistering JMX-exposed beans on shutdown Disconnected from the target VM(springboot启动报错: )

    具体报错 xff1a Unregistering JMX exposed beans on shutdown Disconnected from the target VM address 39 127 0 0 1 52998 39 tra
  • python排序算法——归并排序(附代码)

    python排序算法 归并排序 文章目录 python排序算法 归并排序一 前言二 算法描述三 代码实现总结 一 前言 相关知识来自 python算法设计与分析 初级排序算法是指几种较为基础且容易理解的排序算法 初级排序算法包括插入排序 选