python 归并排序(详解)

Python实现归并排序算法 归并排序(Merge Sort)是一种时间复杂度为O(nlogn)的高效稳定的排序算法,它的基本思想是将一个大问题分解成小问题分别解决,最后将所有小问题的解合并起来得到原问题的解。merge函数的实现方法是,用两个指针分别指向左右两个有序数组的首元素,比较大小,将小的元素依次加入新的有序数组中。上面代码中,merge_sort函数是递归地将数组分成两半,直到每个子数组只剩一个元素,然后调用merge函数合并两个有序数组,最后得到原始数组的排序结果。归并排序的实现需要两个步骤:分治和合并。 阅读详情
AI摘要

本文详细介绍归并排序的基本原理与实现过程。首先介绍了归并排序的概念及其分治策略,随后讲解了具体的排序步骤与合并过程,并提供了Python代码示例。通过本文,读者可以深入理解归并排序的工作机制及其实现细节。

一、归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之),将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,若将两个有序表合并成一个有序表,称为二路归并。

二、归并排序的基本思想

将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列

三、归并排序的算法描述

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

归并排序其实要做两件事:
(1)“分解”——将序列每次折半划分(递归实现)

(2)“合并”——将划分后的序列段两两合并后排序

如何合并?

在每次合并过程中,都是对两个有序的序列段进行合并,然后排序。

这两个有序序列段分别为 R[low, mid] 和 R[mid+1, high]。

先将他们合并到一个局部的暂存数组R2中,带合并完成后再将R2复制回R中。

我们称 R[low, mid] 第一段,R[mid+1, high] 为第二段。

每次从两个段中取出一个记录进行关键字的比较,将较小者放入R2中,最后将各段中余下的部分直接复制到R2中。

经过这样的过程,R2已经是一个有序的序列,再将其复制回R中,一次合并排序就完成了。

四、拆分过程在这里插入图片描述

五、代码实现过程(python)

# 归并排序
def merge_sort(num_list):
    length = len(num_list)

    # 递归终止退出条件
    if length <= 1:
        return num_list

    # 拆分
    mid = length // 2
    left_l = merge_sort(num_list[:mid])   # 对左侧的列表进行排序
    right_l = merge_sort(num_list[mid:])  # 对右侧的列表进行排序

    # merge 合并操作
    # 初始化两个指针p, q 初始位置为起始位置,初始化一个临时数组temp_list
    p, q, temp_list = 0, 0, list()
    len_left, len_right = len(left_l), len(right_l)  # 计算当前被合并的列表的长度

    while len_left > p and len_right > q:
        if left_l[p] <= right_l[q]:
            temp_list.append(left_l[p])
            p += 1
        else:
            temp_list.append(right_l[q])
            q += 1
    # 如果left 和 right 的长度不相等,把长的部分直接追加到列表中
    temp_list += left_l[p:]
    temp_list += right_l[q:]

    return temp_list


if __name__ == '__main__':
    num_list = [44, 23, 1, 14, 6, 9, 4, 5, 33]
    new_list = merge_sort(num_list)
    for k, v in enumerate(new_list):
        num_list[k] = v
    print('num_list:', num_list)

六、时间复杂度和空间复杂度

在这里插入图片描述

七、辅助学习视频资料

https://www.bilibili.com/video/BV1ZW411q7vG?p=3

Python实现归并排序算法——代码详解 可以看到,该函数维护两个指针i和j,分别指向左右两部分数组的起始位置,比较当前两个指针所指的元素大小,并将较小的元素加入结果数组中。总之,归并排序是一种简单而高效的排序算法,可以应用于各个领域的排序问题。使用Python实现归并排序算法不仅易于理解,同时也能够充分发挥Python作为高级语言的优势,提升排序算法的实现效率。归并排序是一种基于比较的排序算法,它将一个序列不断地分割成小块,直到每个小块只有一个元素。可以看到,若待排序数组的长度小于等于1,则无需排序,直接返回该数组。 阅读详情

相关推荐

Python实现归并排序算法(含完整源码)

归并排序(Merge Sort)是一种基于分治思想的经典排序算法,它将待排序的序列分成若干个子序列,对每个子序列进行排序,然后再将排好序的有序子序列合并成一个大的有序序列。函数,然后将结果合并成一个新的有序列表。我们可以看到,这里就是归并排序中的“分”和“治”。函数,用于将两个有序列表合并成一个新的有序列表。,并使用i、j两个指针分别遍历这两个列表,比较它们的元素大小,并将较小的插入到。以上就是本文介绍的Python实现归并排序算法的源代码,我们可以通过调用。函数用于归并排序,它接受一个待排序的列表。

与其临渊羡鱼,不如退而结网 753

归并排序——C语言

归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之),将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,若将两个...

weixin_30437481的博客 489

归并排序详解(python实现)

归并排序详解(python实现)

jacke121的专栏 2603

python实现归并排序

归并排序 “归并"是将两个或者两个以上的有序表组成一个新的有序表。假定待排序表含有n个记录,则可以看成是n个有序的子表,每个子表长度为一,然后两两归并,得到n//2个长度为2或1的有序表;再两两归并,…直到合并成一个长度为n的有序表为止,这种方法称为2-路归并排序。 ...

liulanba的博客 3万+

Python merge sort归并排序算法详解及源码

归并排序(Merge Sort)是一种经典的排序算法,它基于分治的思想,将原始的数组划分为若干个子数组,然后进行递归地排序和合并。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 817

Python 最快的归并排序算法详解及源码

但这种递归方式在实现上比较复杂。最快的归并排序算法采用了自底向上的迭代方式,它首先将序列分割成长度为1的子序列,然后将相邻的子序列两两合并,再依次合并得到更大的有序子序列,直到整个序列有序。最快的归并排序算法采用了自底向上的迭代方式,它首先将序列分割成长度为1的子序列,然后将相邻的子序列两两合并,再依次合并得到更大的有序子序列,直到整个序列有序。最快的归并排序算法采用了自底向上的迭代方式,它首先将序列分割成长度为1的子序列,然后将相邻的子序列两两合并,再依次合并得到更大的有序子序列,直到整个序列有序。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 579

归并排序原理与Python实现详解

归并排序(Merge Sort)是一种基于(Divide and Conquer)的高效排序算法。该算法采用递归思想,将待排序的序列不断拆分成更小的子序列,直到每个子序列只有一个元素,然后将这些有序的子序列合并成更大的有序序列,最终完成整个序列的排序。

qq_43108684的博客 427

F280049C Buffered Digital-to-Analog Converter (DAC)

使用DAC模块很简单,只需要配置参考电压,并写入DACVALS寄存器一个数字值即可。参考电压可配置为外部参考VDAC和内部参考电压1.65V和2.5V,并结合增益作为DAC模块最终的参考电压DACREF。举个例子,配置参考电压为内部参考电压1.65V,增益设置为2,则参考电压DACREF=3.3V,若向DACVALS写入数字值2048,则输出的DAC模块的输出带电压DACOUT=DACVALS×DACREF4096=1.65VDACOUT=

xht2403267701的博客 2369

Python 归并排序算法详解

归并排序是一种高效的排序算法,特别适合处理大规模数据。通过分治法的思想,将大问题分解成小问题,再将小问题的解决方案合并成大问题的解决方案。

licy__的博客 1113

Linux内核4.14版本——drm框架分析(1)——drm简介

drm框架分析

yangguoyu8023的博客 1万+

特征模理论指导滤波天线设计的优势和方法

本文探讨了特征模理论在滤波天线设计中的应用优势和方法。特征模理论通过分析天线结构的本征模特性,突破了传统经验设计的局限,实现了辐射与滤波功能的一体化设计。文章重点阐述了如何利用模式显著性(MS)和模式加权系数(MWC)来指导辐射零点的产生,揭示了辐射零点形成的物理机制。通过特征模分析,设计师可以明确调控天线结构和馈电系统,优化滤波性能。这种方法为现代多频/宽带滤波天线设计提供了理论依据和实用工具,显著提升了设计效率和性能指标。

qq_64207806的博客 957

python归并排序函数详解_Python编程中归并排序算法的实现步骤详解

基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元素放入结果序列中进行合并,最终完成归并排序。归并操作过程:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列设定两个指针,最初位置分别为两个已经排序序列的起始位置比较两个指针所指向的...

weixin_42134537的博客 638

金蝶云星空API实战:从零到一,用Postman打通业务数据流

本文详细介绍了如何使用Postman调试金蝶云星空API,从创建第三方应用到实战调试技巧,帮助开发者快速打通业务数据流。文章重点讲解了API配置的关键细节、常见问题排查方法以及自动化测试方案,提升开发效率与准确性。

weixin_33712987的博客 519

归并排序的详解与python实现

归并排序的详解与python实现 算法思想 归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略,将问题拆分成一些小的问题然后递归求解,然后再将得到的解合并在一起,即分而治之。如下图(图是盗的): 拆分: 合并: 即利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列,直至算法结束。 算法步骤 先把待排序区间 [s,t] 以中点二分; 接着把左边子区间排序; 再把右边子区间排序; 最后把左区间和右区间用一次归并操作合

秋分的剑客的博客 398

【A_Star三维路径规划】基于matlab A_Star算法结合B样条平滑三维地形路径规划(含雷达威胁)【含Matlab源码 3527期】

A_Star算法结合B样条平滑三维地形路径规划(含雷达威胁) 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 741

EAAI title-page-template 怎么填写: 期刊投稿作者信息填写指南

本文详细介绍了期刊投稿时作者信息填写的规范要求。主要内容包括:1)核心填写原则(信息一致性、标注清晰性、通讯作者唯一性);2)具体填写方法演示(作者姓名、单位/机构、通讯作者);3)常见错误规避指南(如单位上标错误、邮箱无效等);4)提供可直接套用的规范模板。特别强调作者姓名拼写、单位标注、通讯作者指定等关键细节,并以深圳大学和同济大学研究团队为例进行说明,帮助投稿者避免因格式问题被退回修改。

ZhangJiqun&191cm&85kg 1087

归并排序详解(附python实现)

一、介绍 归并排序(Merge Sort)指的是利用分治和递归的思想,对一个乱序的数列进行排序。 所谓“分”,指的是将一个乱序数列不断进行二分,得到许多短的序列。 所谓“治”,指的是将这些短序列进行两两合并,然后将合并的结果作为新的序列,再与其他序列进行合并,最终得到一个新的序列。 因此,归并排序具体包括两个步骤:分散、和并。 二、具体步骤 分散和合并的示例参见下图: 1、分散(从整到零) ...

HappyRocking的专栏 5338

微信文件自动归档!手把手教你用OpenClaw搭个自己的“数字员工”,告别重复劳动

很多人说“AI是未来”,但未来不是靠喊口号的。OpenClaw的真正价值,是让你把重复劳动交出去,把时间留给真正需要创造力的事。这事真能干,而且不难。下载OpenClaw(GitHub仓库按我写的步骤跑一遍遇到坑,评论区留言——我亲自帮你看作者后记:上周五,我让AI自动归档了文件后,终于在5点准时下班。回家路上,我给它发了条消息:“干得漂亮”。它没回,但我知道——它在默默等我的下一条指令。

2601_94871597的博客 414

python归并排序函数详解_python 实现归并排序算法

python数据结构与算法总结python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章:《数据结构和算法对python意味着什么?》《顺序表数据结构在python中的应用》《python实现单向链表数据结构及其基本方法》《python实现单向循环链表数据结构及其方法》《python实现双向...文章python之战2019-04-241168浏览量算法基础:五大排序算法...

weixin_39568926的博客 1042

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python归并排序函数详解_归并排序详解(python实现)

因为上个星期leetcode的一道题(Median of Two Sorted Arrays)所以想仔细了解一下归并排序的实现。还是先阐述一下排序思路:首先归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。这样说起来可能很难理解,于是给出一张我画的图。这里显示了归并排序的第一步,将数组按照...

weixin_28940217的博客 486

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

排序算法(六)——归并排序算法详解及Python实现

一、简介 归并排序(Merging Sort)算法是一种稳定排序算法,和堆排序算法一样,都是利用完全二叉树的深度是⌊logn⌋\lfloor logn\rfloor⌊logn⌋+1 的特性,来提高排序效率,其时间复杂度和堆排序相同,均为O(nlogn)。 二、算法介绍 归并排序就是利用归并(将两个或以上的有序表组合成一个新的有序表)的思想实现的排序方法。 基本原理是:假设初设序列有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1, 然后两两归并,得到⌈n/2⌉\lceil n/2 \rceil⌈

明月清風 1001

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

分治典范:Python实现归并排序算法详解

在计算机科学领域,排序算法是数据处理与分析的核心基础,其效率直接影响大规模数据系统的性能。归并排序(Merge Sort)作为一种​​稳定且高效​​的分治算法,自1945年由冯·诺伊曼提出以来,始终占据重要地位。其​​时间复杂度稳定为O(n log n)​​的特性,使其在数据库索引构建、机器学习特征排序及外部存储处理等场景中广泛应用。尤其在Python生态中,归并排序不仅被用于内置排序算法的优化,还为链表排序等特定数据结构提供了高效的解决方案归并排序通过​​分而治之​。

Syhaswm的博客 782

python3实现归并排序算法图文详解

归并排序做为一种比较经典的排序思路,经常在面试中被提及。即使不直接考察也会换种方式涉及,例如很常见的20G超大文件排序问题。这一节就分解下归并的思路,最后用代码实现一下。下一篇我们进行一下扩展,实现超大文件的排序。 文章目录归并排序代码实现时间复杂度稳定性接下来 归并排序 归并排序(Merge Sort)的主要思想就是化整为零,分批治理,再逐层合并结果。和快排有些许类似,同样也是递归的典型使用场景。 例如有下面的list [38,67,26,11,99,20,45,54] 首先是化整为零,分的方法很多,我

T型人小付的博客 965

python归并排序及其在算法设计中的应用详解

归并排序的核心思想是将一个数组分成两个子数组,分别进行排序,然后将排好序的子数组合并成一个有序数组。归并排序的核心思想是将要排序的数组分成两个子数组,分别对这两个子数组进行递归排序,然后再将排好序的子数组进行合并。总结起来,归并排序是一种高效的排序算法,通过将数组分成两个子数组进行递归排序,并将排好序的子数组合并成一个有序数组,从而实现整个数组的排序。函数中,我们首先将数组分成两个子数组,然后对每个子数组进行排序,最后再将两个有序的子数组合并到一个新的列表中。最终,返回合并完成的有序列表,完成排序。

浪子回头 208

python实现归并排序(代码详解)

第一次用python写排序算法,刚下手的时候还有点蒙,一些语法和C都不太一样,之前总是看程序,觉得是语法都熟悉了,结果自己下手的时候还会有很多语法错误,说明学习还是要落实到practice啊,切记眼高手低。 PS:代码是已经跑通了的,可以直接运行,相关注释已经在代码中了 a = [3,7,2,8,5,9,1,6] # print(a[1]) # a.sort() # print(len(a)) l...

weixin_34132725的博客 624
上一篇: python 选择排序算法
下一篇: python调整数组顺序使奇数位于偶数前面
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶知秋的BLOG

创作不易 请多多关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值