当前位置: 首页 > 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 个点的距离之和最小。这…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...