Python归并排序

2023-05-16

归并排序

数据科学家每天都在处理算法。 然而,数据科学学科作为一个整体已经发展成为一个不涉及复杂算法实现的角色。 尽管如此,从业者仍然可以从建立对算法的理解和知识库中受益。

在本文中,对排序算法归并排序进行了介绍、解释、评估和实现。 这篇文章的目的是为您提供有关合并排序算法的可靠背景信息,这些信息可以作为更复杂算法的基础知识。

尽管归并排序被认为并不复杂,但了解该算法将帮助您认识到在选择最有效的算法来执行与数据相关的任务时应考虑哪些因素。 John Von Neumann 创建于 1945 年,他使用分而治之的方法开发了归并排序算法。

分而治之

要理解归并排序算法,您必须熟悉分而治之范式以及递归的编程概念。 计算机科学领域内的递归是指为解决问题而定义的方法涉及在其实现主体中调用自身。

换句话说,该函数重复调用自身。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aLktWDtN-1673409075250)(null)]

分而治之算法(合并排序是一种)在其方法中使用递归来解决特定问题。 分而治之算法将复杂问题分解为更小的子部分,其中定义的解决方案递归地应用于每个子部分。 然后分别解决每个子部分,并重新组合解决方案以解决原始问题。

算法设计的分而治之方法结合了三个主要元素:

  • 将较大的问题分解为较小的子问题。 (划分)
  • 递归利用函数来解决每个较小的子问题。 (征服)
  • 最终解决方案是对较大问题的较小子问题的解决方案的组合。 (结合)

其他算法使用分而治之范式,例如快速排序、二分搜索和施特拉森算法。

归并排序

在按升序对列表中的元素进行排序的上下文中,合并排序方法将列表分成两半,然后遍历新的两半,不断将它们进一步细分为更小的部分。

随后,对较小的一半进行比较,并将结果组合在一起形成最终的排序列表。

步骤与实施

合并排序算法的实现是一个三步过程。 划分、征服和结合。

分而治之方法的划分部分是第一步。 此初始步骤将整个列表分成两个较小的部分。 然后,列表被进一步分解,直到它们不能再被分割,在每个减半的列表中只留下一个元素项。

归并排序第二阶段的递归循环关注的是列表的元素按特定顺序排序。 对于这种情况,初始数组按升序排序。

在下图中,您可以看到归并排序算法中涉及的除法、比较和组合步骤。

实现:

  • 创建一个名为 merge_sort 的函数,它接受一个整数列表作为其参数。 以下所有说明均在此功能内。
  • 首先将列表分成两半。 记录列表的初始长度。
  • 检查记录的长度是否等于 1。如果条件评估为真,则返回列表,因为这意味着列表中只有一个元素。 因此,不需要划分列表。
  • 获取元素个数大于1的列表的中点。使用Python语言时,//除法为无余数。 它将除法结果舍入到最接近的整数。 这也称为楼层划分。
  • 使用中点作为参考点,将列表分成两半。 这是分而治之算法范式的划分方面。
  • 在此步骤中利用递归来促进将列表划分为一半的组件。 变量“left_half”和“right_half”被分配给“merge_sort”函数的调用,接受初始列表的两半作为参数。
  • “merge_sort”函数返回对一个函数的调用,该函数合并两个列表以返回一个组合的、排序的列表。
def merge_sort(list: [int]):
    list_length = len(list)
    
    if list_length == 1:
        return list
    
    mid_point = list_length // 2
    
    left_half = merge_sort(list[:mid_point])
    right_half = merge_sort(list[mid_point:])
    
    return merge(left_half, right_half)
  • 创建一个“合并”函数,它接受两个整数列表作为其参数。 此函数包含分而治之算法范例的征服和组合方面。 以下所有步骤都在此函数体内执行。
  • 将一个空列表分配给保存排序整数的变量“output”。
  • 指针“i”和“j”分别用于索引左列表和右列表。
  • 在 while 循环中,比较左右列表的元素。 每次比较后,输出列表被填充到两个被比较的元素中。 附加元素列表的指针递增。
  • 要添加到排序列表的剩余元素是从当前指针值到相应列表末尾获得的元素。
def merge(left, right):
    output = []
    i = j = 0
    
    while (i < len(left) and j < len(right)):
        if left[i] < right[j]:
            output.append(left[i])
            i +=1
        else:
            output.append(right[j])
            j +=1
    output.extend(left[i:])
    output.extend(right[j:])
    
    return output
    
unsorted_list = [2, 4, 1, 5, 7, 2, 6, 1, 1, 6, 4, 10, 33, 5, 7, 23]
sorted_list = merge_sort(unsorted_list)
print(unsorted_list)
print(sorted_list)

性能和复杂性

大 O 表示法是根据算法的空间要求和执行时间来定义和组织算法性能的标准。

合并排序算法的时间复杂度在其最佳、最差和平均情况下是相同的。 对于大小为 n 的列表,归并排序算法完成的预期步数、最小步数和最大步数都是相同的。

正如本文前面所述,合并排序算法是一个三步过程:分治、合并。 “划分”步骤涉及列表中点的计算,无论列表大小如何,它都需要一个操作步骤。 因此,此操作的符号表示为 O(1)。

“解决”步骤涉及划分和递归求解子数组——符号 log n 表示这一点。 “组合”步骤包括将结果组合成最终列表; 此操作执行时间取决于列表大小并表示为 O(n)。

其平均、最佳和最差时间复杂度的合并排序表示法是 log n * n * O(1)。 在大 O 表示法中,低阶项和常量可以忽略不计,这意味着归并排序算法的最终表示法是 O(n log n)。 关于归并排序算法的详细分析,可以参考这篇文章。

评估

合并排序在对大型列表进行排序时表现良好,但在用于较小列表时,其运行时间比其他排序解决方案慢。 合并排序的另一个缺点是即使初始列表已经排序,它也会执行操作步骤。 在排序链表的用例中,归并排序是最快的排序算法之一。 合并排序可用于外部存储系统(如硬盘驱动器)内的文件排序。

要点

本文通过根据其组成操作和逐步过程对其进行分解来描述归并排序技术。

合并排序算法是常用的,与其他排序算法相比,该算法背后的直觉和实现相当简单。 本文包括归并排序算法在Python中的实现步骤。

您还应该知道,合并排序方法在不同情况下的执行时间的时间复杂度,在最佳、最差和平均情况下保持不变。 推荐在以下场景应用归并排序算法:

  • 处理较大的数据集时,使用归并排序算法。 与其他排序算法相比,合并排序在小型数组上的表现不佳。
  • 链表中的元素引用列表中的下一个元素。 这意味着在合并排序算法操作中,指针是可以修改的,使得元素的比较和插入具有恒定的时间和空间复杂度。
  • 以某种形式确定数组未排序。 归并排序甚至会在已排序的数组上执行其操作,这是一种计算资源的浪费。
  • 当考虑到数据的稳定性时,使用归并排序。 稳定排序涉及维护数组中相同值的顺序。 与未排序的数据输入相比,稳定排序中整个数组中相同值的顺序在排序后的输出中保持在相同的位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python归并排序 的相关文章

  • 使用 volatile 破坏系统代码的九种方法

    首先怼上 xff1a It s hard to overstate how bad an idea it is for a compiler to use strange heuristics about code structure to
  • 微型四轴DIY机架,轻巧稳固耐摔,通用720空心杯电机,9厘米轴距

    组装四轴飞行器时 xff0c 一个轻巧稳固耐摔的机架很关键 轻巧利于续航 xff0c 耐摔是防止炸机后机毁不保影响DIY心情和乐趣 xff0c 稳固对于只有4个螺旋桨的四轴而言利于提高平衡性 针对此情况 xff0c 意创电子推出微行四轴飞行
  • [019] [STM32] 利用定时器输出比较模式的翻转功能实现不同占空比和频率的PWM输出

  • C语言中define的用法总结

    1 宏定义的一般形式为 xff1a 宏定义 xff1a span class token macro property span class token directive keyword define span 标识符 常量 span s
  • 在simulink中使用串口模块接收数据并解帧延迟性问题解决

    山重水复疑无路 xff0c 柳暗花明又一村 最近在simulink中搭了一个模型 xff0c 需要通过串口将外部惯导模块的数据读进来 xff0c 解帧后输入模型中进行计算 xff0c 算是半物理仿真 起初烦恼于不知道如何将这种实时更新的数据
  • Simulink中从Workspace中读取时序数据的方法

    1 首先 xff0c 我从adams得到是时长5秒的500组加速度数据 xff0c 将其存为txt格式 并放入matlab路径中 xff0c 其第一列为时间序号 xff0c 234列为三轴的加速度数据 2 在workspace中使用 tex
  • 简单聊聊Betaflight的三种飞行模式

    大概查了一下网上介绍Betaflight飞行模式的文章很多 xff0c 讲了很多很全面 xff0c 但这里我们去粗取精 xff0c 只谈常用的三种模式Angle xff0c Horizon和Acro模式 下面的内容全部翻译自这个英文网站 1
  • Vim中快速定位到某一行的方法

    1 定位到第一行 xff1a 1 43 shift 43 G 2 定位到最后一行 xff1a shift 43 G 3 定位到第x行 xff1a x 43 shift 43 G 或在Vim中 xff1a xff1a x 补充 xff1a 在
  • PX4源码学习(一):结构概述

    最近在做PX4固件的移植开发工作 xff0c 由于之前没有这方面开发经验 xff0c 加之PX4源码又比较庞杂 xff0c 所以想要通过一点一点的学习梳理和实践 xff0c 使这部分工作能够尽快开展起来 博客中如有错误 xff0c 恳请大家
  • PX4(Pixhawk)和Audupilot(APM)的区别与联系

    一 各自的简要介绍 pixhawk是硬件平台 xff0c PX4是pixhawk的原生固件 xff0c 专门为pixhawk开发 APM xff08 Ardupilot Mega xff09 也是硬件 xff0c Ardupilot是APM
  • Makefile和Cmake的区别和联系

    最近在搞无人机飞控的学习 xff0c 大致了解了下PX4的文件结构和编译 xff0c 它的文件中有许多Makefile和Cmake文件 xff0c 对其在整个文件编译过程中的作用不甚了解 在进行一番查询后 xff0c 终于有了个大致的认识
  • 浮点数在计算机中的表示,程序中浮点数的取值和比较。

    小数的十进制 二进制转换 十进制 gt 二进制 整数部分除2取余 xff0c 小数部分乘2取整 考虑 8 25 整数部分8进行除2取余 xff0c 除2商4余0 除2商2余0 除2商1余0 除2商0余1 所以结果是1000 最后一个余数在最
  • 关于PX4系统移植的新的硬件平台一些尝试总结

    最近尝试将PX4的firmware v1 11 0移植到某stm32h7的飞控平台上 xff08 该飞控硬件 xff0c 适配ardupilot和betaflight的固件 xff0c 但不支持PX4 xff0c 跟厂家沟通过 xff0c
  • RTK中浮点解、固定解的区别

    1 RTK固定解 xff08 fix xff09 简言之 xff0c 拥有固定解意味着解算出了正确的解 在常规条件下 xff0c 你拥有了1 3cm的测量精度 2 RTK浮点解 xff08 float xff09 又称差分解 xff0c 此
  • 飞机的姿态角总结

    飞机的俯仰 横滚 航行角统称姿态角 是飞机机体系相对地理系的相对转角 1 航向角为机体纵轴OYb轴在水平面上投影与OYt之间的夹角 xff0c 取值范围为 0 xff0c 360 xff0c 以机体从北向东偏转为正 2 俯仰角为机体纵轴OY
  • Matlab一些设置记录

    在使用matlab时经常要查一些命令 xff0c 索性在这里整理做一个集合 1 设置figrue背景为白色 xff08 默认为灰色 xff0c 直接截图贴图使用时有一丢丢影响效果 xff09 set 0 39 defaultfigureco
  • 如何学好嵌入式的嵌入式

    近来嵌入式挺火 xff0c 于是大家都往这里挤 我想提醒大家的是 xff0c 嵌入式马上也会成为如今的软件业 在你进来之前请先考虑清楚 但只要我们真的学精了一样东西 xff0c 不管它将来变成什么样 xff0c 哪怕最后只剩下一个人 xff
  • Python全局变量和局部变量(超详细,纯干货,保姆级教学)

    全局变量定义 在函数外部定义的变量 所有函数内部都可以使用这个变量 局部变量定义 在函数内部定义的变量 这个变量只能在定义这个变量的函数内部使用 第一种 xff1a global定义全局变量在自定义函数内部 定义看起来一愣一愣的 xff0c
  • stm32——手动移植HAL库以及错误解决方案(以STM32F103ZE为例)

    寄存器编程的缺点 xff1a 代码可读性差 xff0c 二次开发难度大 xff0c 而且要每次都查阅用户手册 xff0c 非常麻烦 HAL库 xff1a HAL库封装出了一层通用性的接口 xff0c 标准化了一套通用性的接口 xff0c 大
  • MATLAB在线编辑器online

    话不多说直接上网址 https matlab mathworks com 这个和下载的MATLAB功能一模一样 xff0c 这是我找了几个例子运行出来的结果 xff0c 和我想要的一模一样 xff0c 不过对于大多数人而言 xff0c 这个

随机推荐

  • stm32——使用结构体描述寄存器映射

    将地址信息放在一个头文件中方便管理 xff0c 存放地址和偏移量 STM32的外设寄存器的组织形式是 基于基地址 43 寄存器偏移地址 比如 xff0c 在RCC的基地址基础上 xff0c 偏移0x00得到RCC CR寄存器 xff0c 偏
  • 江科大stm32-概述

    第一章 STM32概述 1 1 资源介绍 STM32F103C8T6 51单片机使用的是5V供电 xff0c 还有USB输出的电压也是5V xff0c 5V是不在这个供电电压范围内的 xff0c 不能直接给STM32供电 xff0c 如果是
  • 在eclipse中查看你用的tomcat的路径

    打开eclipse xff0c 选择window gt Preferences gt Server gt Runtime Environments选择你的tomcat然后点Edit xff0c 就会出现它的路径了
  • 安装龙蜥或CentOS 7时出现dracut- initqueue timeout解决方法

    在安装龙蜥7 9操作系统时 xff0c 出现dracut initqueue timeout starting starting timeout scripts报错 CentOS 7 9出现此问题也可以参考同样的方法 如何制作启动盘和系统盘
  • 视觉标记定位aruco使用

    本文的目的是实现生成一张marker broad图片 xff0c 告诉标记检测程序tag在真实世界中的实际大小 检测成功后得到marker的id 四个角点坐标 marker到相机的平移和旋转 xff11 xff0e 下载安装参考 openc
  • github进行修改

    1 xff09 git status xff1a 可以让我们时刻掌握仓库当前的状态 2 xff09 git diff 文件名 xff1a 查看改变的详细信息 xff0c 显示的结果是Unix通用的diff格式 步骤 xff1a 1 修改文件
  • C# 内存与性能优化

    C 内存与性能优化 https www jianshu com p d56f79d83ebd 前两周分享了资源配置与资源管理 xff0c 今天分享一种特殊的资源脚本数据 在Unity项目中 xff0c 我们通常使用C 编写脚本 xff0c
  • Gazebo仿真错误与技巧

    xff08 1 xff09 创建的环境不能保存 打开gazebo创建环境以后 xff0c 不能保存 xff0c 在打开是需要加权限 xff08 sudo xff09 xff0c 详细说明 如果是build可以先保存成模型 xff0c 然后再
  • 《Android入门之旅》

    因为本人在公司任职Java和JavaWeb相关开发工作 EXTJS和JQUERY近年来在网站中使用广泛 EXT江湖对我帮助很大 该书由浅入深地解析了Ext框架的方方面面 xff0c 包括JS基础 Ext的DOM和CSS封装 内置对象的扩展
  • 转发——从搭建小系统到架构分布式

    从搭建小系统到架构分布式 从搭建小系统到架构分布式 SpringBoot是目前Spring技术体系中炙手可热的框架之一 既可用于构建业务复杂的企业应用系统 xff0c 也可以开发高性能和高吞吐量的互联网应用 Spring Boot 框架降低
  • 2018-8-30华为机试第三题

    一个很明显的递归问题 package cn csu ksh import java util ArrayList import java util List import java util Scanner public class Mai
  • 海康威视web3.2开发包开发使用说明

    首言 xff1a 通过海康威视的最新web开发包工具进行js调用引入至vue项目中 xff0c 实现监控设备的对接 xff0c 监控功能的实现 3 2无插件js库同时支持插件安装的模式 目录 首言 xff1a 一 海康威视开发平台 xff1
  • 游戏的navmesh 与rvo动态避障算法(1)

    目前很多手游中如果需要寻路 xff0c 很多时候复杂地形都是需要用到navmesh xff0c 而比较常用的navmesh 系统 xff1a 1 astarpathfinding xff1a 一个老外开发的寻路插件 xff0c 内置有很多寻
  • Python3 指数函数 | numpy.power() math.pow() numpy.exp2() a**b

    对数函数用法 单纯求一个数的指数函数 xff0c 直接用a b比较好 xff1f 2 3 2的三次方 使用pow x y pow 有两种 xff0c 一种是python内置函数 xff0c 一种是math pow 使用python内置函数调
  • SVO2.0

    rpg svo pro open即svo2 0版本在上一年开源了 xff0c 对svo2 0接触了有一小段时间了 xff0c 感觉代码功能和一些函数实现等相比svo1 0版本有区别 xff0c 所以准备把这块好好总结下 xff0c 争取白话
  • ROS CMakeLists.txt中catkin_package和INCLUDE_DIRS的区别

    CMakeLists txt中 catkin package INCLUDE DIRS include 这里代表的是catkin的构建选项 xff0c INCLUDE DIRS表示将使用INCLUDE DIRS后面的内部目录include
  • 利用ROS框架搭建云平台提供机器人服务

    我们要怎么做呢 我们在云平台我们识别物体之后输出的是全局的二维码坐标 x y z 我们接下来要做两件事情 一种是使用云端的服务 xff08 在ROS中的表现形式是云平台提供的action xff09 第二种是请求云端的数据 xff08 可以
  • 虚拟现实技术vr可以用来干什么?虚拟现实技术vr有什么特征

    科技行业的不断蓬勃发展 xff0c 每天会出现一些新的科技产品 xff0c 例如现在很火的虚拟现实技术vr xff0c 虚拟现实技术用的领域很多 xff0c 就拿游戏行业来说 xff0c 玩家可以通过vr眼镜 vr手柄等体验vr游戏 xff
  • vr直播是如何实现的?vr直播都有哪些优势

    科技改变了我们的生活方式 xff0c 提起科技相信大家对这个直播行业恐怕都不陌生 xff0c 最近直播行业也玩出来新的花样 xff0c 引进了vr技术 xff0c 摇身一变 xff0c 变成了vr直播 xff0c 很多朋友不太理解vr直播是
  • Python归并排序

    归并排序 数据科学家每天都在处理算法 然而 xff0c 数据科学学科作为一个整体已经发展成为一个不涉及复杂算法实现的角色 尽管如此 xff0c 从业者仍然可以从建立对算法的理解和知识库中受益 在本文中 xff0c 对排序算法归并排序进行了介