当前位置: 首页 > news >正文

数据结构与算法之美 | 排序(2)

归并排序(Merge Sort)

基本思想

如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。

def merge_sort(array):'''使用归并排序算法对数组进行排序参数:array(list): 待排序数组返回值:array(list): 已排序数组'''if array is None:return []if len(array) == 1:return array# 检查数组长度是否大于1if len(array) > 1:# 将数组分成两半mid = len(array) // 2right_array = array[mid:]left_array = array[:mid]# 递归调用归并排序对左右两半进行排序merge_sort(right_array)merge_sort(left_array)# 初始化左子数组、右子数组和合并后的数组的索引位置left_index = right_index = merge_index = 0# 合并左右两个有序数组while left_index < len(left_array) and right_index < len(right_array):if left_array[left_index] < right_array[right_index]:array[merge_index] = left_array[left_index]left_index += 1else:array[merge_index] = right_array[right_index]right_index += 1merge_index += 1# 在合并排序过程中,左右两个子数组已经是有序的,而剩余的元素必然是较大(或较小)的元素,# 我们需要将它们放入原数组的正确位置以保持整体有序    # 首先,将左侧剩余元素复制到原数组中while left_index < len(left_array):array[merge_index] = left_array[left_index]left_index += 1merge_index += 1# 将右侧剩余元素复制到原数组中while right_index < len(right_array):array[merge_index] = right_array[right_index]right_index += 1merge_index += 1return arrayarray = [6, 5, 12, 10, 9, 1]
print(merge_sort(array)) # Output: [1, 5, 6, 9, 10, 12]

归并排序算法评价

  • 执行效率:最好情况时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),最坏情况时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),平均情况时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

  • 内存消耗:不是一个原地排序算法,空间复杂度为 O ( n ) O(n) O(n)

  • 稳定性:是一个稳定的排序算法

快速排序(Quick Sort)

基本思想

  • 如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)
  • 我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。
  • 经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。
  • 根据分治、递归的处理思想,我们可以用递归排序下标从 p 到 q-1 之间的数据和下标从 q+1 到 r 之间的数据,直到区间缩小为 1,就说明所有的数据都有序了。

使用Python代码实现:

def partition(arr, low, high):"""将数组划分为两部分,左侧的元素小于等于基准点,右侧的元素大于基准点。参数:arr (list): 待划分的数组low (int): 划分区间的起始索引high (int): 划分区间的结束索引返回:pivot_idx(int): 基准点的索引"""i = low - 1pivot = arr[high]  # 选择最后一个元素作为基准点for j in range(low, high):if arr[j] <= pivot:i += 1# 将小于等于基准点的元素放在左侧arr[i], arr[j] = arr[j], arr[i]# 将基准点放置在正确的位置arr[i + 1], arr[high] = arr[high], arr[i + 1]pivot_idx = i + 1return pivot_idxdef quick_sort(arr, low, high):"""实现一个原地快速排序算法参数:arr (list): 待排序列表low (int): 列表的起始索引high (int): 列表的结束索引返回:None"""if low < high:pivot_index = partition(arr, low, high)quick_sort(arr, low, pivot_index - 1)quick_sort(arr, pivot_index + 1, high)# 测试用例
arr = [6, 5, 12, 10, 9, 1]
quick_sort(arr, 0, len(arr) - 1)
print(arr)

快速排序算法评价

  • 执行效率:最好情况时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),最坏情况时间复杂度为 O ( n 2 ) O(n^2) O(n2),平均情况时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

  • 内存消耗:是一个原地排序算法,空间复杂度为 O ( l o g n ) O(logn) O(logn)

  • 稳定性:不是一个稳定的排序算法

参考文献

  • 王争. 排序(下):如何用快排思想在O(n)内查找第K大元素?极客时间. 2018

相关文章:

数据结构与算法之美 | 排序(2)

归并排序&#xff08;Merge Sort&#xff09; 基本思想&#xff1a; 如果要排序一个数组&#xff0c;我们先把数组从中间分成前后两部分&#xff0c;然后对前后两部分分别排序&#xff0c;再将排好序的两部分合并在一起&#xff0c;这样整个数组就都有序了。 def merge_sort…...

【外企面试系列】必备口语短语与例句 - A系列

a big headache令人头痛的事情 I have a big headache from all the noise. (我因为噪音而头痛。)The paperwork is a big headache for me. (对我来说&#xff0c;文书工作是件头痛的事情。) a fraction of 一部分 She ate only a fraction of her meal. (她只吃了一部分饭…...

Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例

Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例 一、Opencv大图找小图说明二、Opencv的window安装1.下载windows下的安装包2.安装3.Java中Opencv加载测试 三、Java中通过Opencv进行模板匹配大图找小图四、进行多图查找五&#xff1a;案例下载bilibili视…...

肠道健康从核心菌属开始:肠道菌群的关键

谷禾健康 5月29日&#xff0c;是世界肠道健康日。肠道是人体最重要的消化系统之一&#xff0c;与人体健康紧密相关。而肠道菌群作为肠道重要组成部分&#xff0c;在肠道健康中发挥着重要的作用。 编辑​ 由于基因、环境、饮食、药物等因素的影响&#xff0c;每个人的肠道菌群都…...

深度学习实战37-NASNet(具有自动搜索能力的神经网络模型)的搭建与实战应用

大家好,我是微学AI,今天给大家介绍一下深度学习实战37-NASNet(具有自动搜索能力的神经网络模型)的搭建与实战应用,NASNet是由Google Brain团队开发的一种具有自动搜索能力的神经网络模型,利用强化学习和进化算法等技术来自动地搜索最优的神经网络架构。NASNet模型的设计灵感…...

碳排放预测模型 | Python实现基于机器学习回归分析的碳排放预测模型——随机森林、决策树、KNN 和多层感知器 (MLP) 预测分析

文章目录 效果一览文章概述研究内容环境准备源码设计KNNRandom ForestDecision TreeMLPModel Evaluation学习总结参考资料效果一览...

人体检测技术之毫米波雷达

人体检测技术之毫米波雷达 1.概述 智能人脸/视频锁领域的人体检测需求是要求远距离达到1m左右即可,一旦在此距离内检测人,则锁唤醒进行人脸识别,视频录制等操作。所以,人体检测技术非常关键。 选型主要是几个维度: 1.支持检测的距离范围,能否准确输出距离信息 2.支持…...

“Chain of Thought Reasoning“ 和 “Chain Prompts“ 是什么

"Chain of Thought Reasoning" 和 "Chain Prompts" 是什么 1. "Chain Prompts" 是什么2. “Chain of Thought Reasoning” 是什么 1. “Chain Prompts” 是什么 “Chain Prompts” 是指一系列相关的提示,它们之间有逻辑上的联系和依赖关系。用户…...

signal

读信号&#xff0c;dqs 是对齐到dq的边沿&#xff0c; 写信号&#xff0c;dqs 的边沿是对到中间的。 spec 就是这样规定的。我们在dq的最中间的采样&#xff0c;肯定是最安全的。 dqs 是对齐到dq的边沿 &#xff0c; 在silicon 内部&#xff0c;还是通过移位完成的。 rl: re…...

深度研究微软的资产负债表和财务状况以及未来投资价值

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 微软股票的关键指标 猛兽财经认为&#xff0c;微软公布的2023财年第三季度财务业绩&#xff0c;有三个关键指标值得投资者关注。 第一个关键指标是利息收入。微软的利息收入目前已经同比增长了44%&#xff0c;从2022财年第…...

Mac电脑删除第三方软件工具CleanMyMac X

经常使用Mac的人都知道&#xff0c;Mac除了可以在AppStore下载应用程序&#xff0c;还有许多软件是需要在网页上搜索下载的第三方软件。那么这类第三方软件软件除了下载方式不同之外还有什么是和从App store下载的软件有区别的吗&#xff1f;答案是肯定的&#xff0c;那就是这些…...

leetcode174. 地下城游戏(java)

地下城游戏 leetcode174. 地下城游戏题目描述 动态规划解题思路代码 动态规划专题 leetcode174. 地下城游戏 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/dungeon-game 题目描述 恶魔们抓住了公主并将她关在了地下城 …...

信号与系统复习笔记——傅里叶变换

信号与系统复习笔记——傅里叶变换 周期信号的傅里叶级数表示 特征函数 假设LTI系统的输入为 x ( t ) e s t x(t) e^{st} x(t)est 输出为&#xff1a; y ( t ) e s t ∗ h ( t ) ∫ − ∞ ∞ e s ( t − τ ) h ( τ ) d τ e s t ∫ − ∞ ∞ e − s τ h ( τ ) d…...

Allegor17.2版本WIN11系统CIS配置提示错误解决方案

错误提示&#xff1a; ERROR(ORCIS-6250): Unable to continue. Database access failed. Contact the database administrator to correct the following error(s), and then retry. ODBC Error Code: -1 Description: 在指定的 DSN 中&#xff0c;驱动程序和应用程序之间的体…...

Java设计模式七大原则-合成聚合复用原则

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 合成-聚合复用原则 1、合成-聚合复用原则介绍 合成/聚合复用原则&#xff08;Composition/Aggregatio…...

SOFA Weekly|可信基础设施技术分论坛、Layotto 社区会议回顾与预告、社区本周贡献...

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展 欢迎留言互动&#xff5e; SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&am…...

Melody 监控(四十九)

当新的世界出现&#xff0c;请立即向他奔去 上一章简单介绍了Spring Boot Actuator详解(四十八), 如果没有看过,请观看上一章 一. JavaMelody 一.一 什么是 Java Melody JavaMelody是一个方便的Java或JavaEE Web 应用程序监控工具。 它允许自动存储由 Web 应用程序的实际操…...

Shell脚本管道符常用搭配命令

1.sort sort命令——以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序输出。 sort [选项] 文件名 cat file | sort [选项] 常用选项 选项作用-n按照数字进行…...

基于html+mysql+Spring+mybatis+Springboot的Springboot宠物医院管理系统

运行环境: 最好是java jdk 1.8&#xff0c;我在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以&#xff0c;如果编译器的版本太低&#xff0c;需要升级下编译器&#xff0c;不要弄太低的版本 tomcat服务器环…...

算法模板(3):搜索(5):其他

搜索 模拟退火 模拟退火一个很关键的是&#xff0c;看看枚举到每一个方案是不是可能的。 3167. 星星还是树 在二维平面上有 n 个点&#xff0c;第 i 个点的坐标为 ( x i , y i ) (x_i,y_i) (xi​,yi​)。请你找出一个点&#xff0c;使得该点到这 n 个点的距离之和最小。这…...

AWS CodeWhisperer 心得体会:安装与使用

大家好&#xff0c;今天我要和大家分享一下我在使用 AWS CodeWhisperer 这个工具时的心得体会。首先&#xff0c;让我们了解一下什么是 AWS CodeWhisperer。 什么是 AWS CodeWhisperer&#xff1f; AWS CodeWhisperer 是一个用于帮助开发者在 AWS 云平台上更轻松地编写、测试…...

高级查询 — 子查询

关于嵌套查询&#xff08;子查询&#xff09; 1.概述 子查询是在一个查询中嵌套另一个查询的查询语句。内部查询从外部查询或数据库中提取数据&#xff0c;然后使用这些数据来执行内部查询。出现在其他语句中的 select 语句&#xff0c;称为嵌套查询或子查询。外部的查询语句…...

霍夫变换(Hough Transform)

文章目录 1. 什么是霍夫变换2. 霍夫直线检测2.1 霍夫直线检测的具体步骤2.2 霍夫直线检测的优缺点2.3 OpenCV中霍夫直线检测的应用2.3.1 标准霍夫检测2.3.2 概率霍夫检测 3. 霍夫圆检测4. 源码仓库地址 1. 什么是霍夫变换 霍夫变换(Hough Transform)是图像处理中的一种特征提取…...

【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等

文章目录 一、压缩字符串思路 二、仅执行一次字符串交换能否使两个字符串相等思路1&#xff1a;计数法思路2&#xff1a;模拟法 总结 一、压缩字符串 点我直达~ 思路 使用双指针法 大致过程如下&#xff1a; 使用双指针&#xff0c;分别读&#xff08;read&#xff09;&…...

V4L2框架解析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、概览二、流程简介三、关键结构体四、模块初始化五、处理用户空间请求 一、概览 相机驱动层位于HAL Moudle与硬件层之间&#xff0c;借助linux内核驱…...

Trie树模板与应用

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/algorithms-notes 】或者公众号【AIShareLab】回复 算法笔记 也可获取。 文章目录 Trie树&#xff08;字典树&#xff09;基本思想例题 Trie字符串统计code关于idx的理解 模板总结应用 最大异或对分…...

【华为OD统一考试B卷 | 200分】跳格子游戏(C++ Java JavaScript Python)

文章目录 题目描述输入描述输出描述用例C++javajavaScriptpython题目描述 地上共有N个格子,你需要跳完地上所有的格子,但是格子间是有强依赖关系的,跳完前一个格子后,后续的格子才会被开启,格子间的依赖关系由多组steps数组给出,steps[0]表示前一个格子,steps[1]表示st…...

该选哪个语言进修呢?

前言&#xff1a; 如今&#xff0c;计算机编程已经成为了许多工作领域中的必备技能。但是&#xff0c;现在的计算机语言有很多&#xff0c;这可能会让我们感到困惑&#xff1a;我应该从哪个语言开始呢&#xff1f;在这篇博客中&#xff0c;我们将详细分析当前流行的一些计算机…...

数据库实验三 数据查询一

任务描述 本关任务&#xff1a;按条件查询数据表的所有字段 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 如何查询数据表的所有字段 相关知识 查询数据表 命令格式&#xff1a; select * from 数据表 where 查询条件 任务要求 打开province数据库 第一题 查询街…...

【Python百日进阶-Web开发-Peewee】Day244 - 数据库 Postgresql、CockroachDB

文章目录 六、数据库6.1 初始化数据库6.2 使用 Postgresql6.2.1 隔离级别 6.3 使用 CockroachDB 六、数据库 http://docs.peewee-orm.com/en/latest/peewee/database.html PeeweeDatabase对象表示与数据库的连接。该类Database使用打开数据库连接所需的所有信息进行实例化&…...

wordpress建站技巧/学编程的正规学校

不久前&#xff0c;一幅由人工智能所作的《埃德蒙贝拉米》画像在纽约佳士得以43.25万美元&#xff08;约为300万人民币&#xff09;的高价拍出&#xff0c;拍出价格远高与同场的毕加索作品。此次事件的爆出&#xff0c;在给人们带来“一幅由人工智能所作的画像竟然能拍出如此天…...

做网站jw100/阿里指数在线查询

大连市民从10月12日起大连公交客运集团票务管理中心对IC卡相关业务进行升级调整IC卡营业网点布局 在现有营业所安装自助充值设备 市民可采用微信、支付宝等进行扫码支付为方便市区东部市民办理公交IC卡相关业务&#xff0c;进一步合理调整IC卡营业网点布局&#xff0c;自10月12…...

做网站698靠谱吗/seo关键词优化推广价格

谷歌插件地址&#xff1a;https://github.com/googleads/googleads-mobile-unity/releases 测试项目流程&#xff1a; 生成Google Admob所有依赖的arr包、jar包&#xff08;会在Plugins/Android下生成&#xff09;生成后最好都单独复制出来&#xff0c;因为打包失败可能会清除…...

wordpress单用户商城/产品网络营销推广方案

前言过去几年&#xff0c;Sun Microsystems 最让同业『津津乐道』的事情&#xff0c;莫过于Sun运用其优越的技术能力研发了Java 技术&#xff0c;可是却从来没有能从Java 身上获取庞大的利益。最具市场价值的企业级应用程序服务器(Application Server)&#xff0c;分别由Bea Sy…...

做 爱 网站小视频下载/郑州网络营销公司哪家好

作者&#xff1a;老岑 很多的时候我们在判断一个数据的时候&#xff0c;是需要很多条件的。 比如我们去修改一个数据&#xff0c;最少要有三个判断&#xff0c;修改成功&#xff0c;修改失败&#xff0c;数据不完整&#xff0c;这三个小小的判断。所需要的代码量可不少。 我们…...

网站一般字体/青岛网络优化哪家专业

一般提及数据可视化&#xff0c;会Python的读者朋友可能第一时间想到的就是matplotlib模块或者是seaborn模块&#xff0c;而谈及绘制动态图表&#xff0c;大家想到的比较多的是Plotly或者是Pyecharts。 注&#xff1a;文末提供Python数据可视化交流群&#xff0c;群内高手如云…...