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

排序算法——归并排序 目录: 🍉算法思想 🥝算法描述 🍒实例 具体步骤: 代码实现: 🍍算法效率分析。 归并排序(Mergesort)是建立在归并的有效操作上进行排序,主要采用分治法将已有序的子序列合并,得到完全有序的序列。即先让每一小段有序,再让小段之间变得有序。将两个有序段归并为一个有序段,称为二路归并;有序段称为归并段。分治法将一个大问题成一些小的问题然后递归求解,而的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之。如下图所示。...... 阅读详情
AI摘要

本文深入讲解归并排序算法,包括其基本概念、具体步骤、复杂度分析及Python实现。通过分解和合并操作,归并排序能高效地对乱序数列进行排序。

一、介绍

归并排序(Merge Sort)指的是利用分治和递归的思想,对一个乱序的数列进行排序。

  • 所谓“分”,指的是将一个乱序数列不断进行二分,得到许多短的序列。
  • 所谓“治”,指的是将这些短序列进行两两合并,然后将合并的结果作为新的序列,再与其他序列进行合并,最终得到一个新的序列。

因此,归并排序具体包括两个步骤:分散、和并。

二、具体步骤

分散和合并的示例参见下图:
在这里插入图片描述

1、分散(从整到零)

将原始序列一刀切开,划分成两个序列。然后每个序列继续切开,又划分成两个更小的序列。

这样一层层地划分,可以得到一颗划分的树,树的叶子节点就是原始序列的每个元素了。

2、合并(从零到整)

从树的叶子节点开始沿着枝干往上合并,序列数越来越少,每个序列的长度越来越大,最终剩下一个序列,这个序列即为所求。

这时候注意,每次合并时,输入的是两个有序数列,输出的是一个合并之后的有序数列。

为什么可以保证输入的是有序的呢?

可以使用数学归纳法来证明。在合并的起始阶段,每个序列就是一个元素,自然是有序的。然后进行正确的合并操作之后,输出的也是有序的。接下来以这个输出的序列为输入继续合并,自然输出也是有序的。因此,最终得到的数列,也是有序的。

那么,关键就在于正确的合并操作是怎么操作了。比如有两个有序的数列 l1l1l1 和 l2l2l2 ,想要对其进行合并,可以:

1、定义两个指针,分别指向两个数列的第一个元素;定义新的空数列,作为结果。
2、依次取出指针值,比较大小,将较小值追加到新数列,同时将较小值的指针往后移动一位。
3、如果其中一个指针到头了,那么将另一个指针剩下的数列直接追加到结果数列即可。
4、直至两个指针都指到了最后一位。

这样,得到的结果数列便是有序数列。

三、复杂度分析

时间复杂度

由“分散”和“合并”两部分组成。

“分散”:最后分成一个个的单一元素,因此复杂度为 O(n)O(n)O(n)。

“合并”:由于每次进行两两合并,因此合并的次数为 O(log2n)O(log_2n)O(log2​n),而每次合并的复杂度为 O(n)O(n)O(n),因此整体合并的复杂度为 O(nlog2n)O(nlog_2n)O(nlog2​n)。

因此,整个算法的时间复杂度为 O(nlog2n)O(nlog_2n)O(nlog2​n)。

空间复杂度

归并的空间复杂度就是那个临时的数组和递归时压入栈的数据占用的空间:n+lognn + lognn+logn;所以空间复杂度为 O(n)O(n)O(n)。

python实现

def merge_sort(lists):
    '''
    递归进行归并排序。
    '''
    # 递归结束条件
    if len(lists) <= 1:
        return lists
    
    # 分治进行递归
    middle = len(lists)//2
    left = merge_sort(lists[:middle])
    right = merge_sort(lists[middle:])
    
    # 将两个有序数组进行合并
    result = []
    i = j = 0
    while i < len(left) and j < len(right):
        # 将较小值放入到result中
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    
    # 将未被扫描到的直接追加到result后面
    if i == len(left):
        result.extend(right[j:])
    else:
        result.extend(left[i:])
    
    return result
    
if __name__ == '__main__':
    a = [2, 6, 10, 3, 5, 8, 4]
    print(merge_sort(a))
python面试:实现归并排序(python经典编程案例) 归并排序(Merge Sort)是一种基于分治法的排序算法。它的核心思想是将一个数组分成两个子数组,分别对子数组进行排序,然后将两个有序的子数组合并成一个有序的数组。归并排序的时间复杂度为 O(n log n),是一种稳定的排序算法。 阅读详情

相关推荐

数据结构 快速排序 输出每一趟结果

描述 用函数实现快速排序,并输出每次分区后排序的结果 Input 第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据 Output 每行输出每趟排序的结果,数据之间用一个空格分隔 Sample Input 10 5 4 8 0 9 3 2 6 7 1 Sample Output 1 4 2 0 3 5 9 6 7 8 0 1 2 4 3 5 9 6 7 8 0 1 2 4 3 5 9 6 7 8 0 1 2 3 4 5 9 6 7 8 0 1 2 3 4 5 8 6 7 9 0 1 2 3 4 5 7 6 8 9 0 1 2 3 4 5 6 7 8 9

排序之归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。所谓归并,就是将两组有序的数据合成为一组有序的数据,例如有如下两个有序数组,将两个有序数组归并为一个有序数组,这就是一次归并操作。

dong132697的博客 2万+

企业微信获取code,URL详解

“https://open.weixin.qq.com/connect/oauth2/authorize?”+ “appid=”企业ID “&redirect_uri=”重定向路径+ “&agentid=”小程序AgentId+ “&response_type=code&scope=snsapi_userinfo&state=123&conn...

weixin_44804985的博客 8733

归并排序

归并排序 public class MergeSort { public static void main(String[] args) { int i = 0; int a[] = { 5, 4, 9, 7, 8, 0, 6, 1, 3, 2 }; int len = a.length; MergeSort(a, 0, len - 1); for (Integer x

Shangri-La 1005

Jetson Nano 【1】入手开箱、烧系统

类似于半开箱哈哈 怀着小期待的心情,屁颠屁颠跑到村口领快递,拿到了这个香喷喷的Jetson Nano 开发板 开箱: 由于太激动了忘记拍点啥,于是在最后留了张全家福 板子的结构: 我觉得这个有必要记录一下,于是去官方文档拿了张图来:官方文档传送 1=SD card 的卡槽,位于第二层板子的背部,也就是大风扇屁股位置 2=40针扩展接头(还没开用) 3=USB的供电口,根据大佬测试(某哩...

椰子奶糖的博客 4195

python 解析bag文件(不用安装ros系统)

在网上找了很多教程都是安装ros系统之后再通过ros自带的包来解析bag文件,但我并不想安装ros系统,之前我也是通过安装ros系统在来解析bag文件,我觉得不是很方便,主要有两点原因,(1)安装ros需要root用户权限(2)ros系统只支持Python2的接口,一般我都是Python3的conda环境,这样每次调用rosbag时都需要先把当前的conda环境注释掉,不然会报错,然后使用完毕在回到conda环境 ros本身是提供了C++和Python的接口,因为我目前的诉求就只是解析bag文件,我想肯定有

sabrinalx的博客 1万+

归并排序(看了就会)

归并排序,是创建在归并操作上的一种有效的排序算法。上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。不管元素在什么情况下都要做这些步骤,所以花销的时间是不变的,所以该算法的最优时间复杂度和最差时间复杂度及平均时间复杂度都是一样的为:O( nlogn )归并排序算法中,归并最后到底都是相邻元素之间的比较交换,并不会发生相同元素的相对位置发生变化,故是稳定性算法。

Circ 2万+

快速理解OSI七层模型(举例理解,数据传输过程,深入理解OSI七层模型)

我们需要了解互联网的本质是一系列的网络协议,这个协议就叫做OSI协议(开放系统互联(Open System Interconnection)),它是由ISO(国际标准化组织)定义的。 需要注意,随着时代的发展,OSI已经被TCP/IP 4层模型淘汰,在当今世界上并没有大规模的使用。 那么对于OSI,人们按照功能不同,分工不同,人为的将OSI的分为七层。实际上这七层是并不存在的,也就是说没有这些概念,而我们今天提到的七层概念,只是人为的划分而已。目的只是为了让大家更好地理解这些都是用来做什么的。

CN_TangZheng的博客 3万+

Python实现归并排序

Python实现归并排序

weixin_43790276的博客 1万+

Outlook邮件备份全攻略:从导出到导入的完整流程(附常见问题解决)

本文提供了一份详尽的Outlook邮件备份全攻略,涵盖从导出到导入的完整流程。重点解析了经典桌面版Outlook的.pst文件备份方法、进阶的智能筛选备份策略,以及如何通过导入恢复和工具验证确保备份可用。同时,文章还介绍了构建自动化备份体系与异地容灾的最佳实践,并附有常见问题解决方案,帮助用户建立可靠的邮件数据安全防线。

weixin_29248611的博客 891

KVM — 与 QEMU 和 Libvirt 的关系

目录目录 前言 KVM QEMU KVM 与 QEMU qemu-kvm Libvirt Libvirt 在 OpenStack 中的应用前言如果是刚开始接触虚拟机技术的话, 对上述的概念肯定会有所混淆, 傻傻的分不清. 尤其在看虚拟化技术文档时导致理解能力下降, 所以在开始学习虚拟化技术之前对这些概念有一个整体的认识和清晰的理解, 就显得很有必要了.KVMKVM(Kernel-basedVirtu

烟云的计算 5737

python 归并排序(详解)

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

田亚辉的博客 1万+

【数据集】2019年中国1km格网河网密度数据集

中国1km格网河网密度数据集

WW、forever的博客 1344

归并排序python实现

文章目录归并排序python实现归并排序完整算法时间复杂度 归并排序python实现 归并排序 归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法 首先是一个例子 原序先通过一半一半的拆分,然后: 然后再一步一步的向上合并,在合并的过程中完成了排序,合并排序算法如下: def merge(s1,s2,s): """将两个列表是s1,s2按顺序融合为一个列表s...

I'm Sfencs 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

python实现归并排序

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

liulanba的博客 3万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

归并排序的详解与python实现

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

秋分的剑客的博客 398

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

T型人小付的博客 965

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

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

qq_43108684的博客 427

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

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

weixin_39568926的博客 1042

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

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

明月清風 1001

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

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

weixin_42134537的博客 638

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

归并排序 运作: 1.将一个序列从中间位置分成两个序列; 2.在将这两个子序列按照第一步继续二分下去; 3.直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。 代码实现 def merge_sort(lis): # 递归结果条件 if len(lis)<=1: return lis # 分治进行递归 mid=len(lis)//2 left=merge_sort(lis[:mid]) right=me

weixin_44160044的博客 577
上一篇: Leetcode算法——21、合并两个有序链表
下一篇: Leetcode算法——22、生成括号字符串
HappyRocking
博客等级 码龄12年 222粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值