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

完整教程:数据结构与算法篇-排序算法-统一视角

完整教程:数据结构与算法篇-排序算法-统一视角

排序算法 – 统一视角

本系列文章尝试从"挑战拆分+基准情况+组合解"该统一视角出发,理解各种排序。

问题求解流程

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

本系列文章合集:


选择排序

子问题定义

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)

初始子问题(原难题):
insertSort(arr, 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)

区间划分状态:

初始子难题(原问题)

heapSort(arr, n)

区间划分状态:

基准情况

heapSize<=1

heapSort(arr, 1)

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

区间划分状态:

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

问题拆分

拆分前:heapSort(arr, heapSize)

目标:将当前堆区间的最大值放在其最终位置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)

组合子问题的解


http://www.jsqmd.com/news/385185/

相关文章:

  • 题解:洛谷 P10372 [AHOI2024 初中组 / 科大国创杯初中组 2024] 家庭作业
  • 题解:洛谷 P9973 [THUPC 2024 初赛] 你说得对,但是 AIGC
  • 构造喵喵题收录
  • 2026年2月热门排阻厂商有哪些?速来掌握,合金检测电阻/低温漂高精密电阻/采样电阻/电阻,排阻源头厂家哪个好 - 品牌推荐师
  • 2026年荣誉代理固态电容公司有哪些?排行信息来了,业展代理电流采样/低温漂高精密电阻/宝宫代理,荣誉代理品牌联系方式 - 品牌推荐师
  • 激光切管机怎么选?2026十大品牌技术实力巅峰对决 - 匠言榜单
  • 互联网大厂Java面试:从Spring MVC到微服务架构的技术问答
  • 2026耐高温电阻市场观察:这些公司值得关注,低TCR高精密电阻/精密电阻/业展代理/低温漂高精密电阻,电阻公司推荐榜 - 品牌推荐师
  • 从性能出发,探讨国内耐脉冲电阻的优选品牌,THUNDER盛雷城代理/3PPM高精密电阻,电阻供应厂家哪家靠谱 - 品牌推荐师
  • 细胞群体动力学仿真软件:NetLogo_(5).NetLogo编程语言介绍
  • C#并发编程新宠:Channel通道全解析(第一部分)
  • ASP.NET Core Blazor简介和快速入门一(基础篇)
  • 细胞群体动力学仿真软件:NetLogo_(5).细胞状态与环境交互
  • GTK4图片查看器项目实战:从零构建专业图像应用
  • 提示工程架构师经验谈:模式的5个必用技巧+反模式的4个必避坑
  • IntelliJ IDEA Maven 工具栏消失怎么办?完整教程:从入门到实战部署
  • Flourish(Line, bar and pie charts 模板)使用可视化操作方法
  • 细胞群体动力学仿真软件:NetLogo_(3).细胞自动机理论基础
  • 细胞群体动力学仿真软件:NetLogo_(4).基本模型构建
  • DeepSeek悄咪咪放大招:上下文暴涨至1M,知识库直抵2025年5月,收藏这份AI技术进化秘籍!
  • 细胞群体动力学仿真软件:NetLogo_(3).NetLogo用户界面详解
  • 细胞群体动力学仿真软件:NetLogo_(4).NetLogo中的细胞模型创建
  • Springboot3+vue3的网上购物商城商品销售平台
  • Springboot3+vue3语言的设备故障报修管理系统
  • 细胞群体动力学仿真软件:NetLogo_(2).NetLogo界面与基本操作
  • 细胞群体动力学仿真软件:NetLogo_(2).安装与配置NetLogo
  • 大数据运维与管理专业学习数据分析的必要性
  • 【Docker进阶篇】告别OOM Kill!Java容器化内存与CPU限制实战指南
  • 深入了解大数据领域Kafka的生产者与消费者
  • 2026年耐高温电阻市场盘点:哪些公司电阻品质更可靠?耐高压电阻/荣誉代理固态电容,电阻供应厂家推荐榜 - 品牌推荐师