Python归并排序

news2025/1/19 7:51:37

归并排序

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

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

尽管归并排序被认为并不复杂,但了解该算法将帮助您认识到在选择最有效的算法来执行与数据相关的任务时应考虑哪些因素。 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中的实现步骤。

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

  • 处理较大的数据集时,使用归并排序算法。 与其他排序算法相比,合并排序在小型数组上的表现不佳。
  • 链表中的元素引用列表中的下一个元素。 这意味着在合并排序算法操作中,指针是可以修改的,使得元素的比较和插入具有恒定的时间和空间复杂度。
  • 以某种形式确定数组未排序。 归并排序甚至会在已排序的数组上执行其操作,这是一种计算资源的浪费。
  • 当考虑到数据的稳定性时,使用归并排序。 稳定排序涉及维护数组中相同值的顺序。 与未排序的数据输入相比,稳定排序中整个数组中相同值的顺序在排序后的输出中保持在相同的位置。

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

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

相关文章

Educational Codeforces Round 141 (Rated for Div. 2)(A~D)

A. Make it Beautiful给出一个数组&#xff0c;将它重新排列&#xff0c;使得它成为一个beautiful数组。ugly数组的定义是存在一个数&#xff0c;为前面所有数字的和。思路&#xff1a;升序排序后一前一后构造数组&#xff0c;最后判断一下即可。AC Code&#xff1a;#include &…

Android 深入系统完全讲解(10)

8 如何定位界面&#xff0c;定位代码 这一节我们来说说如何定位界面&#xff0c;这个也是一个神器&#xff0c;今天来讲讲 hierarchyviewer.bat 的用法&#xff0c;AS 也有新的工具&#xff0c;但是我还是喜欢这个工具&#xff0c;于是我们开始讲这个。 我们使用 Genymotion …

Win32公共控件使用,进度条实现Marquee样式

参考:https://learn.microsoft.com/zh-cn/windows/win32/controls/progress-bar-control Comctl的全称是Common Controls,也就是公共控件的意思,属于Windows系统的一部分,提供了一组标准的UI控件,如Button、ListView等等。 Comctl32主要有两个大版本,v5和v6,最明显的两个…

【C++11】新特性入门

目录 一、C11简介 二、列表初始化 三、声明 1. auto 2. decltype 3. nullptr 四、范围for 五、STL中一些变化 1. array容器 2. forward_list容器 3. unordered_map和unordered_set容器 一、C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff…

IOzone I/O测试工具使用说明

IOzone磁盘读写工具使用说明0. IOzone简介1. 下载及安装1.1 下载1.2 编译并安装1.3 IOzone 效用测量什么&#xff1f;2. IOzone参数介绍3. 10 个 IOZone 示例3.1 使用默认值运行所有 IOZone 测试3.2 使用 iozone -b 将输出保存到电子表格3.3 使用 iozone -i 仅运行特定类型的测…

BMP图片格式分析(超详细)

系列文章目录 文章目录系列文章目录前言一、BMP格式概览二、实战分析bmp图片数据前言 对学习C感兴趣的可以看看这篇文章哦&#xff1a;C/C实战入门到精通 BMP图片大家见的应该也比较多&#xff0c;它是一种非常基本的图片格式 因为最近对C生成二维码比较感兴趣&#xff0c;用…

【golang】rune

一、背景 来看下2023.1.11的每日一题&#xff0c;是个简单题 2283. 判断一个数的数字计数是否等于数位的值几乎都有思路&#xff0c;先遍历一遍把数存在map中&#xff0c;第二次遍历直接判断就可以。 二、解答 我的解答&#xff08;很久不写代码了&#xff09; 开始想着map的…

autoCell:用于scRNA-seq的分析工具

目录简介引言相关工作贡献数据集和对比方法autoCell高斯混合模型图嵌入结果插补去噪后轨迹分析潜在特征捕获细胞病理学发现细胞类型特异性分子网络简介 动机&#xff1a;scRNA-seq使研究人员能够以单细胞分辨率研究基因表达。然而&#xff0c;由dropout引起的噪声可能会妨碍精…

mac快速配置iterm2

文章目录安装 iterm2设置为默认终端安装 oh-my-zsh 设置默认 shell查看 shell 有几种安装 oh-my-zsh设置默认 shell配置主题安装插件安装高亮插件设置快捷键安装 iterm2 自行官网下载 iterm2 设置为默认终端 Mac 默认终端即“终端”&#xff0c;我们可以把好用的 iterm2 设置…

Pytorch复习笔记--导出Onnx模型为动态输入和静态输入

目录 1--动态输入和静态输入 2--Pytorch API 3--完整代码演示 4--模型可视化 5--测试动态导出的Onnx模型 1--动态输入和静态输入 当使用 Pytorch 将网络导出为 Onnx 模型格式时&#xff0c;可以导出为动态输入和静态输入两种方式。动态输入即模型输入数据的部分维度是动态…

Elasticsearch:运用 Go 语言实现 Elasticsearch 搜索 - 8.x

在我之前的文章 “Elasticsearch&#xff1a;Go 客户端简介 - 8.x”&#xff0c;我对 Elasticsearch golang 客户端做了一个简单的介绍。在今天的这篇文章中&#xff0c;我将详细介绍如何使用这个客户端来一步一步地连接到 Elasticsearch&#xff0c;进而创建索引&#xff0c;搜…

流程编辑器bpmnjs的改造1:设计器外观和布局

重新设计页面&#xff0c;弄一个比较规范的设计器外观和布局&#xff0c;bpmnjs.css加入如下的代码&#xff1a;/* Frame CSS */html,body{width:100%;height:100%}.toolsBar{position:fixed;width:100%;height:40px;background-color:#FFF; border-bottom:1px solid #E1E1E1;d…

Linux安装Docker完整详细教程

目录 Docker及系统版本 Docker的自动化安装 Docker的手动安装&#xff08;CentOS7&#xff09; 1.1 卸载历史版本的Docker 1.2 安装依赖包 1.3 更新本地镜像源(也可以叫做&#xff1a;设置源仓库) 1.4 Docker安装 1.5 配置镜像加速 Docker启动 删除Docker Docker其…

连接池PgBouncer部署与踩坑实践

安装 可以直接使用 yum install pgbouncer 安装&#xff08;rpm管理的是1.14版本&#xff09; 或者在http://www.pgbouncer.org/downloads/ 下载最新的tat.gz包 解压出来进入目录&#xff0c;通过 ./configure --prefix/home/pgbouncermake & make install 安装&…

01等概率发生器、随机函数、对数器

1.数据结构 数据结构:是由连续结构、跳转结构或者连续加跳转(可能有多个叉)结构组成 数据结构是很多算法得以进行的载体 数组&#xff1a;便于寻址不便于删增数据&#xff08;需要不断移动数据&#xff0c;如果不动可能就不是连续结构&#xff09; 链表&#xff08;跳转结构…

jupyter notebook 暗黑模式新方法

1 直接浏览器采用暗黑模式 &#xff08;1&#xff09;首先我们打开谷歌浏览器&#xff0c;在浏览器地址栏中输入“chrome://flags”然后按下回车键。 &#xff08;2&#xff09;之后我们会进入谷歌浏览器的实验室页面&#xff0c;在页面左上方的搜索框中输入“enable-force-…

DocuWare客户案例——温德姆镇使用 DocuWare Cloud 改善市民服务

DocuWare客户案例——温德姆镇使用 DocuWare Cloud 改善市民服务 新冠疫情刚开始时&#xff0c;州和地方政府除了发挥传统作用以外&#xff0c;还要负责遏制疫情的关键措施。税收和联邦援助的收入没有增加&#xff0c;跟不上这一新职责的需求。采用减轻管理负担的技术是节省资源…

2022十大边缘计算开源项目

随着“开源”被纳入“十四五”规划发展纲要&#xff0c;“支持数字技术开源社区等创新联合体发展&#xff0c;完善开源知识产权和法律体系&#xff0c;鼓励企业开放软件源代码、硬件设计和应用服务”。开源发展按下了加速键&#xff01; 开源软件生态蓬勃发展&#xff0c;边缘…

Internet结构和ISP

目录 1. ISP / IXP / ICP 定义 2. 网络连接宏观结构 3. 网络连接层级结构 4. ISP 连接方式 1. ISP / IXP / ICP 定义 ISP&#xff1a;Internet Service Provider&#xff0c;即互联网服务提供商。主要为用户提供互联网接入业务、信息业务的运营商&#xff0c;如移动和电信等。 …

数据结构学习之栈

这里写目录标题栈的定义与性质栈的实现栈的定义栈的功能栈的创建入栈出栈栈顶判断栈为空得到栈的个数栈的销毁栈的定义与性质 第一个问题&#xff1a;什么是栈&#xff1f; 栈的定义是&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。…