基于Python3的数据结构与算法 - 07 归并排序

news2024/9/21 4:21:16

一、归并

引入

假设现在的列表分两段有序,如何将其合并成为一个有序列表。

这种操作成为一次归并。

归并的思路

  1. 分别对两个列表进行遍历,比较两个列表中的最小值,将更小的取出来。
  2. 取出后一次进行上操作,直到其中一个列表中的元素被取完。
  3. 再直接将列一个列表中的剩下元素全部取出。

实现代码如下:

def merge(li, low, mid, high):
    # 两个列表合并一块,最左边为low,最右边为high,第一个列表的最后一个元素下标为mid
    # 则列表被分为两部分,一个为low - mid,另一个为mid+1 - high
    # 最开始定义两个箭头 + 一个存放返回的空列表
    i = low
    j = mid +1
    ltmp = []
    while i<= mid and j <= high:
        if li[i] < li[j]:  # 此时i小,则将i对应的数取出,箭头向下移动一位
            ltmp.append(li[i])
            i += 1
        else:
            ltmp.append(li[j])
            j += 1
    # 当while执行完后必定是两部分中的一个没有剩余数字
    while i <= mid:   #对应左边的列表还有剩余
        ltmp.append(li[i])
        i += 1
    while j <= high:   #对应右边的列表还有剩余
        ltmp.append(li[j])
        j += 1
    # 最后将数值返回li
    li[low:high+1] = ltmp
    
li = [1,4,7,2,5,8]
print(li)
merge(li, 0, 2, 5)
print(li)

输出结果如下:

此时我们实现了将两个有序列表合并为一个有序列表。

二、归并排序的实现

大致分为三步:

  • 分解:将列表越分越小,直至分成一个元素。
  • 终止条件:一个元素是有序的
  • 合并:将两个有序列表归并,列表越来越大。

代码的思路:主要运用了递归,对于整个无序列表,我们想要将其变为有序列表,主要采用以下三步:

  1. 确定好mid后,先将左边的排为有序
  2. 再将右边的拍为有序
  3. 最后采用上面提到的归并的思路,将两个有序的列表归并为一个列表。
def merge_sort(li, low, high):
    if low <  high:
        mid = (low+high) // 2
        merge_sort(li,low,mid)
        merge_sort(li,mid+1,high)
        merge(li,low,mid,high)
        
li = [1,4,7,2,5,8,3,6,9]
print(li)
merge_sort(li, 0, len(li)-1)
print(li)

输出的结果如下:

因此,整个综合代码如下所示:

def merge(li, low, mid, high):
    # 两个列表合并一块,最左边为low,最右边为high,第一个列表的最后一个元素下标为mid
    # 则列表被分为两部分,一个为low - mid,另一个为mid+1 - high
    # 最开始定义两个箭头 + 一个存放返回的空列表
    i = low
    j = mid +1
    ltmp = []
    while i<= mid and j <= high:
        if li[i] < li[j]:  # 此时i小,则将i对应的数取出,箭头向下移动一位
            ltmp.append(li[i])
            i += 1
        else:
            ltmp.append(li[j])
            j += 1
    # 当while执行完后必定是两部分中的一个没有剩余数字
    while i <= mid:   #对应左边的列表还有剩余
        ltmp.append(li[i])
        i += 1
    while j <= high:   #对应右边的列表还有剩余
        ltmp.append(li[j])
        j += 1
    # 最后将数值返回li
    li[low:high+1] = ltmp


    
def merge_sort(li, low, high):
    if low <  high:
        mid = (low+high) // 2
        merge_sort(li,low,mid)
        merge_sort(li,mid+1,high)
        merge(li,low,mid,high)
        
li = [1,4,7,2,5,8,3,6,9]
print(li)
merge_sort(li, 0, len(li)-1)
print(li)

 三、归并排序的复杂度

1. 时间复杂度

一次归并的时间复杂度为O(n),可以参考上图中的分解和合并考虑归并算法的时间复杂度。

每次进行的操作的复杂度为O(n),共有O(logn)层,因此总共的时间复杂度为O(nlogn)

2. 空间复杂度

因为在merge中我们开辟了一个空间ltmp[],因此空间复杂度为O(n).

pyhton中的sort方法是基于归并排序的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1480422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web自动化笔记六:弹出框处理

1、弹出框类型&#xff1a; 1)、alert 警告框 2)、confirm 确认框 3)、prompt 提示框 2、弹出框处理方法&#xff08;方法三种弹出框操作都一样&#xff09; 1)、获取弹出框对象&#xff1a; alert driver.switch_to.ale…

笔记72:关于IMU(惯性测量单元)传感器的作用【不涉及公式推导】

一、IMU传感器是什么&#xff1a; 惯性测量单元IMU&#xff08;Inertial Measurement Unit&#xff09;是一种使用【加速度计】和【陀螺仪】来测量【物体三轴姿态角&#xff08;空间姿态&#xff09;】的装置&#xff1b;IMU在坐标系的每个坐标轴上&#xff0c;均安装有1个陀螺…

Unity(第十八部)物理力学,碰撞,触发、关节和材质

1、重力 刚体组件 英文中文描述RigidBody刚体组件physics->rigidbody &#xff0c;刚体组件使一个物体有了质量&#xff0c;重力等。&#xff0c;use gravity 勾选后&#xff0c;物体才会受到重力&#xff0c;会自动下落&#xff0c;取消勾选就不会。&#xff0c;&#xf…

初学JavaScript总结

0 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;需要给他注入灵魂&#xff0c;所以接下来需要学习JavaScript&#xff0c;这门语言会让页面能够和用户进行交互。JavaScript又称为脚本语言&#xff0c;可以通过脚本实现用户和页面的…

1.1为什么需要对数值类型的特征做归一化?

01 知识点&#xff1a;特征归一化&#xff08;第一章 特征工程&#xff09; 摘要&#xff1a; 为什么需要对数值类型的特征做归一化&#xff1f; 简要回答&#xff1a;对数值类型的特征做归一化&#xff0c;使得各指标除以同一个数量级&#xff0c;以便进行分析。 场景描述 为…

AI时代来临:解锁大模型的神秘面纱!

在AI时代的黎明&#xff0c;大模型技术的发展不仅仅是科技进步的一个标志&#xff0c;更是人类文明新篇章的开启。这篇文章旨在揭开大模型的神秘面纱&#xff0c;探索其对未来社会的深远影响。 大模型&#xff0c;作为人工智能领域的一个重要分支&#xff0c;其核心在于构建能…

内网搭建mysql8.0并搭建主从复制详细教程!!!

一、安装mysql 1.1 mysql下载链接&#xff1a; https://downloads.mysql.com/archives/community/ 1.2 解压包并创建相应的数据目录 tar -xvf mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local cd /usr/local/ mv mysql-8.2.0-linux-glibc2.28-x86_64/ mysql mkdir…

Pytorch学习 day01(Jupyter安装、常用函数、三种编辑器的对比)

Jupyter 安装过程中遇到的问题&#xff1a; Anaconda的base环境会自动安装Jupyter&#xff0c;但是如果我们要在其他环境中安装Jupyter&#xff0c;就需要注意&#xff0c;该环境的python版本不能高于3.11&#xff0c;且用以下代码安装&#xff1a; conda install nb_conda_…

迭代模型:让项目管理更加高效与灵活

迭代模型&#xff1a;让项目管理更加高效与灵活 在当今快速变化的市场环境中&#xff0c;项目管理面临着前所未有的挑战。传统的瀑布模型已无法满足不断变化的需求&#xff0c;而迭代模型则以其灵活性和适应性成为了项目管理的新宠。本文将详细介绍迭代模型的概念、特点、应用…

基于vue3 BIMFACE 单楼层平滑切换

模型加载 vue3使用hooks实现模型的加载 hooks文件: useBimLoad.js import { getAccessToken, getViewToken } from "/api/bimface";//获取accessToken和viewToken&#xff0c;自行编写 import { toRefs } from "vue";export function useBimLoad(props)…

Android Tombstone 分析

1.什么是tombstone Tombstone是指在分布式系统中用于标记数据已被删除的记录&#xff0c;通常包含删除操作的时间戳和相关信息。 当一个动态库&#xff08;native程序&#xff09;开始执行时&#xff0c;系统会注册一些连接到 debuggerd 的signal handlers。当系统发生崩溃时…

浪潮服务器使用ARCCONF查看RAID配置信息

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、获取ARCCONF二、使用步骤1.Windows Server 20221.查看RAID控制器2.查询控制器属性3.查询虚拟磁盘属性4.查询物理硬盘属性 2.Ubuntu-22.043.CentOS7 三、配置…

精益工程师3000工资与30000工资的区别!

在同一职场征程中&#xff0c;为何有的精益工程师月入仅三千&#xff0c;而另一些则能达到三万&#xff1f;这一差距&#xff0c;远超薪酬数额的简单对比&#xff0c;它深刻反映了专业能力、工作态度和个人品质的全面差异。 首先&#xff0c;对于刚踏入职场的精益工程师而言&a…

1.3 vue ui框架-element-ui框架

1 前言 ElementUI是一套基于VUE2.0的桌面端组件库&#xff0c;ElementUI提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面。 ElementUI官网 https://element.eleme.io 2 安装 运行命令 cnpm i element-ui -S -S表示只在该项目下安装&#xff0c;不是全局安…

Springboot配置定时任务

介绍SpringBoot集成定时任务的过程。 目 录 1、引入相关依赖 2、启动类添加注解 3、定时任务类添加注解 4、cron表达式 5、总结 1、引入相关依赖 SpringBoot自带定时任务配置&#xff0c;只要引入springboot相关类即可。 2、启动类添加注解 在启动类上添加注解EnableSch…

【学习心得】Python调用JS的三种常用方法

在做JS逆向的时候&#xff0c;一种情况是直接用Python代码复现JS代码的功能&#xff0c;达成目的。但很多时候这种方法有明显的缺点&#xff0c;那就是一旦JS代码逻辑发生了更改&#xff0c;你就得重写Python的代码逻辑非常不便。于是第二种情况就出现了&#xff0c;我直接得到…

CDN CloudFlare 接入 OCI 对象存储

在当今数字化时代&#xff0c;网站性能和可用性是业务成功的关键。为了提供快速且可靠的访问体验&#xff0c;许多组织正在寻找有效的内容分发网络&#xff08;CDN&#xff09;解决方案。CloudFlare作为业界领先的CDN提供商&#xff0c;其强大的全球网络基础设施能够加速网站内…

UE学习笔记--解决滚轮无法放大蓝图、Panel等

我们发现有时候创建蓝图之后&#xff0c;右上角的缩放是1&#xff1a;1 但是有时候我们可能需要放的更大一点。 发现一直用鼠标滚轮像上滚动&#xff0c;都没有效果。 好像最大只能 1&#xff1a;1. 那是因为 UE 做了限制。如果希望继续放大&#xff0c;我们可以按住 Ctrl 再去…

Excel常用公式总结非常实用

16个最实用的Excel万能公式 1、多条件判断 IF(And(条件1,条件2..条件N),条件成立返回值) IF(or(条件1,条件2..条件N),条件成立返回值) 2、多条件查找 Lookup(1,0/((条件1*条件2*...条件N)),返回值区域&#xff09; 3、多条件求和 Sumifs(值区域,判断区域1,条件1,判断区域2,条…

hive报错:FAILED: NullPointerException null

发现问题 起因是我虚拟机的hive不管执行什么命令都报空指针异常的错误 我也在网上找了很多相关问题的资料&#xff0c;发现都不是我这个问题的解决方法&#xff0c;后来在hive官网上与hive 3.1.3版本相匹配的hadoop版本是3.x的版本&#xff0c;而我的hadoop版本还是2.7.2的版本…