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

归并排序:分治思想的经典应用

归并排序

一、核心原理

分治思想

  1. :把数组不断从中间拆成左右两半,直到每个子数组只剩 1 个元素(天然有序);
  2. :把两个有序子数组合并成一个大的有序数组;
  3. 递归向上合并,最终整个数组有序。

口诀:先拆分、再合并,分而治之

二、算法特性

  1. 排序模型:分治 + 二路归并
  2. 时间复杂度
    • 最好 / 最坏 / 平均:O(n logn)
    • 无最好最坏区分,性能稳定
  3. 空间复杂度
    • 递归版:O(n)临时数组 + O (logn) 递归栈
  4. 稳定性:稳定排序(相等元素相对位置不变)
  5. 特点
    • 不适合海量内存外排序(可做外部排序
    • 不能原地排序(常规版需额外数组)
    • 数据量大比插入 / 冒泡快很多

三、适用场景

  • 大数据量排序
  • 要求稳定、时间复杂度严格 O (nlogn)
  • 外部排序(文件超大放不下内存)
  • 链表排序(归并排序对链表极友好,无需额外空间)

四、递归版归并排序

cpp

#include <iostream> #include <vector> using namespace std; // 合并两个有序区间 [l,mid] [mid+1,r] void merge(vector<int>& arr, vector<int>& tmp, int l, int mid, int r) { int i = l; // 左区间起点 int j = mid + 1; // 右区间起点 int k = l; // 临时数组起点 // 逐个比较,小的先放入tmp while (i <= mid && j <= r) { if (arr[i] <= arr[j]) tmp[k++] = arr[i++]; else tmp[k++] = arr[j++]; } // 拷贝左区间剩余 while (i <= mid) tmp[k++] = arr[i++]; // 拷贝右区间剩余 while (j <= r) tmp[k++] = arr[j++]; // 临时数组 拷贝回 原数组 for (int p = l; p <= r; ++p) arr[p] = tmp[p]; } // 递归分治 void mergeSortRecur(vector<int>& arr, vector<int>& tmp, int l, int r) { if (l >= r) return; int mid = (l + r) / 2; mergeSortRecur(arr, tmp, l, mid); mergeSortRecur(arr, tmp, mid+1, r); merge(arr, tmp, l, mid, r); } // 对外接口 void mergeSort(vector<int>& arr) { vector<int> tmp(arr.size()); mergeSortRecur(arr, tmp, 0, arr.size()-1); } int main() { vector<int> a = {5,2,4,6,1,3}; mergeSort(a); for (int x : a) cout << x << " "; return 0; }

五、知识点扩展

1. 为什么是稳定排序?

合并时判断用arr[i] <= arr[j]相等先取左边,相对位置不变 → 稳定。

2. 缺点

  • 需要额外 O (n) 临时数组,空间开销大
  • 递归有栈开销

3. 优化点

  1. 子数组长度较小时(比如 len<=15),改用插入排序,减少递归拆分开销;
  2. 提前判断:如果arr[mid] <= arr[mid+1],说明左右已经整体有序,无需合并;
  3. 非递归迭代版归并排序,消除递归栈开销。

六、非递归(迭代版)归并排序

cpp

void mergeSortIter(vector<int>& arr) { int n = arr.size(); vector<int> tmp(n); // 步长:从1开始,每次翻倍 for (int len = 1; len < n; len <<= 1) { // 每两组合并一次 for (int l = 0; l + len < n; l += len * 2) { int mid = l + len - 1; int r = min(l + 2 * len - 1, n - 1); merge(arr, tmp, l, mid, r); } } }
http://www.jsqmd.com/news/796291/

相关文章:

  • 2026年GEO实战复盘:这10家服务商如何帮客户拿下AI搜索高地? - 品牌2025
  • 2026年浙江二手线路板设备回收处置全景指南:从成本困局到产能升级的正确打开方式 - 年度推荐企业名录
  • 西安不干胶标签定制厂家排名2026:规上工厂产能对比与快印代工选型建议 - 优质企业观察收录
  • 无锡木木金银回收:滨湖专业的黄金回收找哪家 - LYL仔仔
  • 终极macOS菜单栏管理指南:用Ice告别杂乱界面
  • 5分钟掌握跨平台歌词同步:开源工具终极指南
  • 免费医学影像转换神器:dcm2niix完整使用指南
  • 构建开源流媒体实时告警系统:从事件驱动架构到OBS集成实战
  • 别再只用fswebcam拍照了!用树莓派+罗技C310打造你的简易监控系统(附定时抓拍脚本)
  • 江西省青蜂环保:赣州四害防治公司有哪些 - LYL仔仔
  • 天猫购物卡回收指南,轻松变现省心又快捷 - 团团收购物卡回收
  • Honey Select 2终极增强指南:一键解锁完整游戏体验的完整解决方案
  • 2026年泸州老酒回收机构哪家好 主打透明交易与专业鉴定 适配各类老酒变现需求 - 深度智识库
  • 三分钟带你读懂什么是:二分查找算法
  • 2026年无锡充电桩运营系统深度横评:SaaS服务与社区生态物联解决方案完全指南 - 企业名录优选推荐
  • 2026中文AI对决:Gemini与国产模型谁更强
  • 霍尔定理和最大流算法 入门
  • 别被“AI概念”忽悠了!2026年GEO服务商筛选实录:只看这几点 - 品牌2025
  • 深度解析现代化前端编辑器:5大核心特性构建高效图片编辑体验
  • 理性消费:让瑞祥商联卡中每一分钱都发挥最大价值 - 团团收购物卡回收
  • 2026最新宋氏美学家具/新中式家具生产厂家推荐!国内优质权威榜单发布,广东佛山等地实力品牌优选 - 十大品牌榜
  • FanControl终极指南:免费Windows风扇控制软件完全教程
  • Linux Socket 编程(TCP:socket, bind, listen, accept,connect, write, read;UDP:sendto, recvfrom)
  • 如何高效使用B站字幕下载工具:释放视频学习价值的完整指南
  • 奇点大会闭门报告首曝:AI原生联邦学习系统不是升级,而是重构——基于LLM驱动的元协调器(Meta-Orchestrator)架构图谱(含开源PoC链接)
  • 2026全国监控杆采购选型QA测评:从陕西市场看厂商实力与风险规避 - 深度智识库
  • 机器人实时控制中的VLA模型与延迟优化技术
  • Intel RealSense D435i 标定实战:从工具安装到VINS配置全流程解析
  • 从零到一:基于STM32F1与SPL库的lwIP-2.1.2裸机移植实战(ENC28J60驱动适配)
  • SoC自适应雷达信号处理架构在6G与智能驾驶中的应用