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

归并排序:稳定排序的典范

归并排序稳定排序的典范算法原理核心思路归并排序是一种基于分治思想的稳定排序算法其核心思想是分解将数组分成两个子数组递归地对两个子数组进行排序合并将两个已排序的子数组合并成一个有序数组复杂度分析时间复杂度O(n log n)其中 n 是数组的长度。无论输入数据的分布如何时间复杂度都是 O(n log n)。空间复杂度O(n)需要额外的空间来存储合并过程中的临时数组。代码实现def merge_sort(arr): 归并排序 if len(arr) 1: return arr # 分解将数组分成两个子数组 mid len(arr) // 2 left merge_sort(arr[:mid]) right merge_sort(arr[mid:]) # 合并将两个已排序的子数组合并成一个有序数组 return merge(left, right) def merge(left, right): 合并两个已排序的数组 result [] i j 0 # 比较两个数组的元素将较小的元素加入结果数组 while i len(left) and j len(right): if left[i] right[j]: result.append(left[i]) i 1 else: result.append(right[j]) j 1 # 将剩余的元素加入结果数组 result.extend(left[i:]) result.extend(right[j:]) return result # 原地归并排序需要额外的空间 def merge_sort_in_place(arr, temp, low, high): 原地归并排序 if low high: mid (low high) // 2 merge_sort_in_place(arr, temp, low, mid) merge_sort_in_place(arr, temp, mid 1, high) merge_in_place(arr, temp, low, mid, high) def merge_in_place(arr, temp, low, mid, high): 原地合并两个已排序的子数组 # 将元素复制到临时数组 for i in range(low, high 1): temp[i] arr[i] i low # 左子数组的指针 j mid 1 # 右子数组的指针 k low # 原数组的指针 # 比较两个子数组的元素将较小的元素放回原数组 while i mid and j high: if temp[i] temp[j]: arr[k] temp[i] i 1 else: arr[k] temp[j] j 1 k 1 # 将左子数组剩余的元素放回原数组 while i mid: arr[k] temp[i] i 1 k 1 # 将右子数组剩余的元素放回原数组已经在正确的位置 # while j high: # arr[k] temp[j] # j 1 # k 1代码解析基础实现递归终止条件如果数组长度小于等于 1直接返回数组。分解将数组分成两个子数组递归地对两个子数组进行排序。合并将两个已排序的子数组合并成一个有序数组。原地实现分解将数组分成两个子数组递归地对两个子数组进行排序。合并使用临时数组来辅助合并两个已排序的子数组。实战技巧优化技巧小规模子数组对于小规模的子数组例如长度小于 10使用插入排序可以提高性能。避免复制在合并操作中尽量减少元素的复制次数提高效率。并行处理对于大规模数据可以使用并行处理来提高排序速度。稳定性归并排序是一种稳定的排序算法即相等元素的相对顺序在排序前后保持不变。这在某些场景下非常重要例如当需要按照多个关键字排序时。错误分析常见错误边界条件处理错误没有正确处理数组长度为 0 或 1 的情况。合并操作错误在合并两个子数组时没有正确处理剩余元素。临时数组使用错误在原地归并排序中没有正确使用临时数组。性能问题对于大规模数据没有进行适当的优化导致性能下降。扩展思考变种问题自底向上的归并排序不需要递归从最小的子数组开始逐步合并。外排序当数据量超过内存容量时使用归并排序的思想进行外排序。多路归并合并多个有序数组。计数归并排序结合计数排序的思想提高排序效率。应用场景归并排序在以下场景中有着广泛的应用稳定排序需要保持相等元素相对顺序的场景。外排序当数据量超过内存容量时。链表排序归并排序特别适合链表排序因为不需要额外的空间。逆序对计数可以通过归并排序来高效计算逆序对的数量。个人实践感悟最近在准备转正答辩每天被各种算法题和合并冲突吓醒救命今天复习归并排序算法突然想到刚实习时第一次写归并排序代码的场景。当时我还不知道如何正确实现合并操作结果写了一个时间复杂度为 O(n²) 的版本被mentor嘲笑了一整天麻了现在再看这个算法其实归并排序的核心就是分治思想和合并操作。通过将数组分解成小的子数组分别排序后再合并可以得到高效的排序算法。这让我意识到算法的学习真的是一个循序渐进的过程从一无所知到熟练掌握需要不断地练习和总结。最后分享一个小技巧在面试中遇到需要稳定排序的问题首先要想到归并排序。归并排序是一种稳定的排序算法掌握它的实现和原理对于解决稳定排序相关的问题非常有帮助。这就是大佬吗我也要成为这样的人输入输出示例输入输出示例 1输入arr [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] print(merge_sort(arr))输出[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]输入输出示例 2输入arr [5, 4, 3, 2, 1] temp [0] * len(arr) merge_sort_in_place(arr, temp, 0, len(arr) - 1) print(arr)输出[1, 2, 3, 4, 5]结语归并排序是一种高效的稳定排序算法掌握它不仅有助于解决相关的算法问题也能帮助我们更好地理解分治思想。希望这篇文章对大家有所帮助祝大家刷题愉快本文由 cannonjinx 原创转载请注明出处。

相关文章:

归并排序:稳定排序的典范

归并排序:稳定排序的典范 算法原理 核心思路 归并排序是一种基于分治思想的稳定排序算法,其核心思想是: 分解:将数组分成两个子数组,递归地对两个子数组进行排序合并:将两个已排序的子数组合并成一个有序数…...

CYBER-VISION零号协议SolidWorks设计文档智能解读与生成

CYBER-VISION零号协议:让AI读懂你的SolidWorks设计图 每次打开一个复杂的SolidWorks装配体文件,面对几十上百个零件,你是不是也头疼过整理物料清单、编写设计说明?或者,当同事发来一份设计文档,你需要花半…...

GTE文本向量模型部署全攻略:从零到一搭建企业级文本处理服务

GTE文本向量模型部署全攻略:从零到一搭建企业级文本处理服务 1. 项目介绍与核心价值 如果你正在寻找一个能一站式解决中文文本分析难题的工具,那么GTE文本向量模型可能就是你的答案。想象一下,一个模型就能帮你识别文档里的关键人物、地点&…...

计算机毕业设计springboot基于的突发事件信息共享系统 基于Spring Boot的应急事件协同处理平台 利用Spring Boot构建的突发状况信息交互系统

计算机毕业设计springboot基于的突发事件信息共享系统 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在当今社会,各类突发事件频发,从自然灾害到公共卫生…...

YOLOv8工业部署翻车实录:6类典型报错日志解析,附可直接复用的CI/CD流水线脚本

第一章:YOLOv8工业部署翻车实录:6类典型报错日志解析,附可直接复用的CI/CD流水线脚本模型导出阶段:ONNX Shape Inference 失败 当执行 yolo export modelyolov8n.pt formatonnx opset12 时,常见报错:Runtim…...

终极指南:Jellyfin豆瓣插件完整配置手册,30分钟打造中文媒体库

终极指南:Jellyfin豆瓣插件完整配置手册,30分钟打造中文媒体库 【免费下载链接】jellyfin-plugin-douban Douban metadata provider for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-douban 还在为Jellyfin媒体库缺少…...

Python张量框架选型不是技术问题,而是组织问题:CTO必须在立项前确认的5个战略问题(含人才储备周期、长期维护成本、专利风险审计清单)

第一章:Python张量框架选型不是技术问题,而是组织问题当团队在 PyTorch、TensorFlow 和 JAX 之间反复争论“哪个性能更好”或“哪个 API 更优雅”时,往往已陷入技术决定论的误区。真正制约张量框架落地效果的,是组织内部的协同惯性…...

L1-083 谁能进图书馆,python解法

题目:为了保障安静的阅读环境,有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆,除非有 18 岁以上(包括 18 岁)的成人陪同”。现在有两位小/大朋友跑来问你,他们能不能进去?请…...

RTX4090D优化版Qwen3-32B+OpenClaw:3小时搞定AI办公自动化

RTX4090D优化版Qwen3-32BOpenClaw:3小时搞定AI办公自动化 1. 为什么选择本地部署方案 去年冬天,当我第17次被飞书机器人返回的"API配额不足"提示打断工作流时,终于下定决心寻找替代方案。作为一个小型技术团队的负责人&#xff0…...

【华为OD机试真题】手牌接龙 · 最大出牌次数(C++)

一、真题题目描述:手里给一副手牌,数字从0-9,有(红色),g(绿色),b(蓝色),y(黄色)四种颜色,出牌规则为每次打出的牌必须跟上一张的数 字或者颜色相同,否则不能抽选。 选手应该怎么选才…...

OpenClaw+Qwen3-32B-Chat:3种模型调用方式对比与选型建议

OpenClawQwen3-32B-Chat:3种模型调用方式对比与选型建议 1. 为什么需要对比模型调用方式? 第一次在本地部署Qwen3-32B-Chat模型时,我遇到了一个典型的技术选择困境:究竟应该直接调用本地模型,还是通过API访问远程服务…...

DanKoe 视频笔记:生产力提升:专注工作的力量 [特殊字符]

在本节课中,我们将要学习如何通过每天仅 4 小时的专注工作,来显著改变你的生活轨迹。我们将探讨注意力的价值、识别高回报机会的方法,并掌握一套进入并保持深度专注状态的实用技巧。 能够有意识地引导你的注意力,不仅能节省时间&a…...

使用 Java Comparator 实现复杂排序逻辑

本文介绍了如何使用它 Java Comparator 对 Actor 对列表进行排序,包括 Actor 有类型(如 "Artist"、"Producer"、"Mixer" 等等)和名称。排序规则是:首先按类型优先排序("Artist" 最优先,然后是 "Producer&q…...

Wemod-Patcher:开源工具实现WeMod功能增强的完整方案

Wemod-Patcher:开源工具实现WeMod功能增强的完整方案 【免费下载链接】Wemod-Patcher WeMod patcher allows you to get some WeMod Pro features absolutely free 项目地址: https://gitcode.com/gh_mirrors/we/Wemod-Patcher 在游戏体验优化领域&#xff0…...

AI Agent 时代的“将领艺术“:一个人如何指挥一支开发军队

摘要:本文探讨在 AI Agent 时代,开发者如何从"单兵作战"转变为"一人成军",核心在于任务拆分能力、Agent 调度能力和系统集成能力。通过战争将领的类比,提供一套可复用的 Agent 项目管理框架。 关键词&#x…...

辅助用电系统安装:工业项目电力配套的关键环节问题全解析

在工业厂房、园区配套、商业综合体、仓储物流中心以及各类生产型项目中,很多人一提到电气工程,第一反应往往是高压配电、变压器、动力柜或者主供电系统。但真正决定项目是否“好用、稳用、久用”的,往往不是主系统本身,而是隐藏在…...

Qwen3-ASR-1.7B在C++项目中的集成与应用

Qwen3-ASR-1.7B在C项目中的集成与应用 1. 环境准备与快速部署 要在C项目中集成Qwen3-ASR-1.7B语音识别功能,首先需要准备好开发环境。这个模型虽然功能强大,但部署起来并不复杂,只需要几个简单的步骤。 系统要求: 操作系统&am…...

Coda Prompt 实战:如何通过智能提示提升开发效率

作为一名开发者,每天面对海量代码,你是否也常常感到疲惫?重复的 CRUD 操作、频繁在文档和 IDE 之间切换、为某个函数命名绞尽脑汁……这些看似微小的“摩擦力”,日积月累却严重消耗着我们的精力与时间。今天,我想和大家…...

会Python可以找什么工作?

Python凭借简洁易用、功能强大的特点,成为当下就业面极广的编程语言。不少人学会后却不清楚可以找什么工作,其实从开发、数据分析到自动化运维都有大量机会,接下来为大家详细讲解一下。会Python后,可以找的工作有很多,…...

如何用 AI + OpenSpec 驱动团队迭代开发

一个真实的痛点你是否遇到过这样的场景:写个正则表达式?AI 秒杀我。写个独立脚本?AI 真香。写个炫酷网页?AI 真牛 X!但是一旦将 AI 扔进一个庞大的微服务项目里,它似乎立刻降智为了“新手小白”&#xff1f…...

WarcraftHelper全方位优化指南:解决魔兽争霸III现代适配难题

WarcraftHelper全方位优化指南:解决魔兽争霸III现代适配难题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 当你在4K显示器上启动魔兽争霸…...

Chrome WebRTC 实战:构建高可靠实时通信系统的关键技术与避坑指南

最近在做一个需要实时音视频通信的项目,选型时自然想到了 WebRTC。虽然标准很美好,但在 Chrome 浏览器里真正把它用起来、特别是用到生产环境,那真是“坑”出不穷。从 NAT 穿不透导致连不上,到不同设备上视频卡成 PPT,…...

ViGEmBus虚拟控制器驱动完全指南:从技术原理到场景落地的突破方案

ViGEmBus虚拟控制器驱动完全指南:从技术原理到场景落地的突破方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 价值定位:重新定义…...

Python 入门第一课:为什么选择 Python?3 分钟搭建你的第一个程序

一、先聊点人话:为啥要学 Python? 说实话,当初我选编程语言的时候也纠结过。Java?太啰嗦。C?头都大了。JavaScript?浏览器里跑着玩还行… 直到我遇见了 Python。 这玩意儿有多友好? 这么说吧&…...

Bypass Paywalls Clean:3步轻松解锁付费内容的终极指南

Bypass Paywalls Clean:3步轻松解锁付费内容的终极指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字内容付费化的今天,你是否经常遇到想阅读的文章却…...

如何快速美化Windows任务栏:TranslucentTB完全指南

如何快速美化Windows任务栏:TranslucentTB完全指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Windows系统一…...

MediaPipe TouchDesigner GPU视觉插件实战:从零构建实时交互应用的完整指南

MediaPipe TouchDesigner GPU视觉插件实战:从零构建实时交互应用的完整指南 【免费下载链接】mediapipe-touchdesigner GPU Accelerated MediaPipe Plugin for TouchDesigner 项目地址: https://gitcode.com/gh_mirrors/me/mediapipe-touchdesigner 你是否厌…...

网易云音乐无损音乐下载器:5分钟搞定你的私人音乐库终极方案

网易云音乐无损音乐下载器:5分钟搞定你的私人音乐库终极方案 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为网易云音乐的无损音乐无…...

造相-Z-Image-Turbo 在计算机网络教学中的应用:可视化展示协议交互角色

造相-Z-Image-Turbo:让计算机网络协议“活”起来的教学新助手 每次讲到TCP三次握手、HTTP请求响应这些概念,看着台下学生迷茫的眼神,你是不是也感到头疼?协议栈、数据包、端口号,这些抽象的名词和冰冷的箭头图&#x…...

ThinkPad双风扇深度解析:TPFanCtrl2实战配置与性能优化指南

ThinkPad双风扇深度解析:TPFanCtrl2实战配置与性能优化指南 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 TPFanCtrl2是一款专为ThinkPad双风扇机型设计的…...