跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言算法

排序算法的统一视角:问题拆分与组合解

综述由AI生成从“问题拆分 + 基准情况 + 组合解”的统一视角出发,系统梳理了选择排序、冒泡排序、插入排序、归并排序、堆排序及快速排序六种常见算法。通过定义子问题、确定基准情况及组合策略,帮助读者深入理解各类排序算法的核心逻辑与实现差异。

竹影清风发布于 2026/3/30更新于 2026/5/2621 浏览
排序算法的统一视角:问题拆分与组合解

排序算法的统一视角

本系列文章尝试从'问题拆分 + 基准情况 + 组合解'这个统一视角出发,理解各种排序。

问题求解流程

  • 第一步:原问题怎么拆分?
  • 第二步:最小的子问题是什么?
  • 第三步:如何组合子问题的解得到原问题的解?

选择排序

子问题定义

selectionSort(arr, start):表示当前要排序的子区间是 arr[start...n-1]

初始子问题 (原问题)

selectionSort(arr, 0):表示当前要排序的子区间是 arr[0...n-1]

基准情况

start >= n-1 表示当前要排序的子区间是 arr[start...n-1] 的长度为 0 或者 1。因为单个元素或者空集是有序的,所以该问题已解决,不用继续拆分了。

问题拆分

拆分前:selectionSort(arr, start)

目标:保证位置 start 对应的元素已在其最终位置上。

操作:从左向右遍历未排序区间,找到最小值,与未排序区间的首个元素交换

拆分后:selectionSort(arr, start+1)

组合子问题的解

无


冒泡排序

子问题定义

bubbleSort(arr, start):表示当前要排序的子区间是 arr[start...n-1]

初始子问题 (原问题)

bubbleSort(arr, 0):表示当前要排序的子区间是 arr[0...n-1]

基准情况

start >= n-1 表示当前要排序的子区间是 arr[start...n-1] 的长度为 0 或者 1。因为单个元素或者空集是有序的,所以该问题已解决,不用继续拆分了。

问题拆分

拆分前:bubbleSort(arr, start)

目标:保证位置 start 对应的元素已在其最终位置上。

操作:从右向左遍历未排序区间 arr[start...n-1],不断比较相邻元素,如果逆序就交换,最终使得最小值冒泡到该区间的左侧。

拆分后:bubbleSort(arr, start+1)

组合子问题的解

无


插入排序

子问题定义

insertSort(arr, start):

  • 表示当前要排序的子区间是 arr[start...n-1]
  • 区间 arr[0...start-1] 已有序

初始子问题 (原问题):

insertSort(arr, 1):

  • 表示当前要排序的子区间是 arr[1...n-1]
  • 区间 arr[0...0] 已有序,因为此时该区间只有 1 个元素。
基准情况

start >= n 表示当前要排序的子区间是 arr[n...n-1] 的长度为 0,且区间 arr[0...start-1] 已有序。因为空集是有序的,所以该问题已解决,不用继续拆分了。

问题拆分

拆分前:insertSort(arr, start)

目标:保证位置 start 对应的元素已在其最终位置上。

操作:取未排序区间 arr[start...n-1] 的首个元素 arr[start],从已有序区间 arr[0...start-1] 中找到其正确的插入位置,将其插入。

拆分后:insertSort(arr, start+1)

组合子问题的解

无


归并排序

子问题定义

mergeSort(arr, left, right):表示当前要排序的子区间是 arr[left...right]

初始子问题 (原问题)

mergeSort(arr, 0, n-1):表示当前要排序的子区间是 arr[0...n-1]

基准情况

left >= right:表示当前要排序的子区间是 arr[left...right],它的长度为 1 或者 0,因为单个元素或者空集是有序的,不用继续拆分了。

问题拆分

拆分前:mergeSort(arr, left, right)

操作:取区间的中点 mid = left + (right-left)/2。

拆分后:mergeSort(arr, left, mid) 和 mergeSort(arr, mid+1, right)

组合子问题的解

合并,即两个有序的子区间 arr[left...mid] 和 arr[mid+1...right] 合并成一个整体有序的区间 arr[left...right]。


堆排序

子问题定义

heapSort(arr, heapSize):

  • 当前要排序的子区间是 arr[0...heapSize-1]

区间划分状态:

  • 区间 arr[0...heapSize-1] 已经是一个合法的堆
  • 区间 arr[heapSize..n-1] 已有序,且每个元素都在最终位置上

初始子问题 (原问题)

heapSort(arr, n):

  • 当前要排序的子区间是 arr[0...n-1]

区间划分状态:

  • 区间 arr[0...n-1] 已经是一个合法的堆
  • 区间 arr[n..n-1] 已有序,且每个元素都在最终位置上
基准情况

heapSize<=1

heapSort(arr, 1):

  • 当前要排序的子区间是 arr[0...0]

区间划分状态:

  • 区间 arr[0...0] 已经是一个合法的堆
  • 区间 arr[1..n-1] 已有序,且每个元素都在最终位置上
问题拆分

拆分前:heapSort(arr, heapSize)

目标:将当前堆区间的最大值放在其最终位置 heapSize-1 上

操作:

  • 将当前堆区间 arr[0, heapSize-1] 的最大值跟 arr[heapSize-1] 交换
  • heapSize--;
  • 对缩小后的堆区间 arr[0,heapSize-1] 执行下沉操作,以恢复堆性质

拆分后:heapSort(arr, heapSize-1)

组合子问题的解

无


快速排序

子问题定义

quickSort(arr, left, right):表示当前要排序的子区间是 arr[left...right]

初始子问题 (原问题)

quickSort(arr, 0, n-1):表示当前要排序的子区间是 arr[0...n-1]

基准情况

left >= right:表示当前要排序的子区间是 arr[left...right],它的长度为 1 或者 0,因为单个元素或者空集是有序的,不用继续拆分了。

问题拆分

拆分前:quickSort(arr, left, right)

目标:先让区间中的一个元素 (基准元素) 归位到其最终有序位置,后再拆分

操作:

  • 选择 arr[right] 为基准元素 pivot。
  • 借助某种高效的划分机制,使得基准元素归位到其最终有序位置 pivotIndex。
  • 使得所有小于等于 pivot 的元素都在其左侧,所有大于 pivot 的元素都在其右侧。

拆分后:quickSort(arr, left, pivotIndex-1) 和 quickSort(arr, pivotIndex+1, right)

组合子问题的解

无

目录

  1. 排序算法的统一视角
  2. 问题求解流程
  3. 选择排序
  4. 子问题定义
  5. 基准情况
  6. 问题拆分
  7. 组合子问题的解
  8. 冒泡排序
  9. 子问题定义
  10. 基准情况
  11. 问题拆分
  12. 组合子问题的解
  13. 插入排序
  14. 子问题定义
  15. 基准情况
  16. 问题拆分
  17. 组合子问题的解
  18. 归并排序
  19. 子问题定义
  20. 基准情况
  21. 问题拆分
  22. 组合子问题的解
  23. 堆排序
  24. 子问题定义
  25. 基准情况
  26. 问题拆分
  27. 组合子问题的解
  28. 快速排序
  29. 子问题定义
  30. 基准情况
  31. 问题拆分
  32. 组合子问题的解
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python pytest 框架使用指南:自动化测试入门
  • Python+UniApp 微信小程序坭兴陶文化传承与创新系统设计
  • Web 开发者构建多模态 Agent 图像识别技能:JS+Python 全栈实践
  • Web 开发者构建多模态 Agent 图像识别技能的全栈实战
  • RK3588 结合 FPGA 实现 BT1120 转 3G-SDI 方案解析
  • GitHub Token 权限配置与安全实践指南
  • 多模态 Agent 图像识别 Skills 开发实战:Web 全栈图像处理方案
  • AI 大模型系统学习路线:从入门基础到工程实战
  • OpenClaw AI 助手浏览器自动化功能配置实战
  • 插入排序详解:直接插入排序与希尔排序及性能对比
  • Ubuntu 22.04 安装向日葵远程控制
  • GitHub 分支保护规则设置:禁止直接 Push 强制 Pull Request
  • 从记忆化搜索到动态规划:状态表示、转移方程与空间优化
  • Epoll 水平触发与边缘触发:面试核心考点解析
  • URDF 机器人模型描述标准 XML 格式详解
  • Llama-3.2V-11B-COT 模型视觉推理质量评估指南
  • SkyWalking 告警通知渠道集成:Webhook、Slack、钉钉、企业微信
  • 大模型 AI 产品经理学习路线:从基础到精通
  • 利用 GPT4 和 DALL·E 制作 AI 绘画短视频指南
  • C++ 面向控制标记编程(CMOP)核心思想与实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online