【408考研复习】数据结构核心笔记:字符串模式匹配与内部排序算法全解析


文章目录

    • [📝 一、 字符串模式匹配算法](#📝 一、 字符串模式匹配算法)
      • [1. BF 算法(Brute-Force 暴力匹配)](#1. BF 算法(Brute-Force 暴力匹配))
      • [2. KMP 算法](#2. KMP 算法)
    • [📝 二、 插入类排序(Insertion Sort)](#📝 二、 插入类排序(Insertion Sort))
      • [1. 直接插入排序](#1. 直接插入排序)
      • [2. 折半插入排序(Binary Insertion Sort)](#2. 折半插入排序(Binary Insertion Sort))
      • [3. 希尔排序(Shell Sort)](#3. 希尔排序(Shell Sort))
    • [📝 三、 交换类排序(Exchange Sort)](#📝 三、 交换类排序(Exchange Sort))
      • [1. 冒泡排序(Bubble Sort)](#1. 冒泡排序(Bubble Sort))
      • [2. 快速排序(Quick Sort)](#2. 快速排序(Quick Sort))
    • [📝 四、 选择类排序(Selection Sort)](#📝 四、 选择类排序(Selection Sort))
      • [1. 简单选择排序(Simple Selection Sort)](#1. 简单选择排序(Simple Selection Sort))
      • [2. 堆排序(Heap Sort)](#2. 堆排序(Heap Sort))
    • [📝 五、 归并排序与基数排序](#📝 五、 归并排序与基数排序)
      • [1. 二路归并排序(2-Way Merge Sort)](#1. 二路归并排序(2-Way Merge Sort))
      • [2. 基数排序(Radix Sort)](#2. 基数排序(Radix Sort))
    • [📊 📊 六、 总结:408内部排序全算法速查大表](#📊 📊 六、 总结:408内部排序全算法速查大表)

📝 一、 字符串模式匹配算法

1. BF 算法(Brute-Force 暴力匹配)

  • ⚖️ 算法核心与方法总结(原笔记)

  • "就像插槽一样,要求从左往右一一完全对应,才匹配"

  • 做题切入点:在匹配过程中,若发生失配,主串指针需要回溯。核心技巧在于"看错最后一位"(注意失配位置与主串回溯的对应关系)。

  • ⏳ 性能指标补充

  • 时间复杂度 :最好情况 O ( n + m ) O(n+m) O(n+m),最坏情况 O ( n × m ) O(n \times m) O(n×m)(其中 n n n 为主串长度, m m m 为模式串长度)。

  • 空间复杂度 : O ( 1 ) O(1) O(1)。

2. KMP 算法

  • ⚖️ 算法核心与方法总结(原笔记)

  • 前缀串 :例如,串 abc 的前缀包括 a, ab

  • 后缀串 :例如,串 abc 的后缀包括 c, bc

  • next[] 数组的求解 :寻找前缀串与后缀串的"无相同字符"(最长公共前后缀)。若前缀和后缀完全无相同字符,则对应的公共长度为 0,指针根据对应的 next 规则回溯(无相同字符则向特定初始值靠拢)。

  • ⏳ 性能指标补充

  • 时间复杂度 : O ( n + m ) O(n+m) O(n+m)(主串指针不回溯,仅模式串指针利用 next 数组滑动)。

  • 空间复杂度 : O ( m ) O(m) O(m)(需要额外的 next 数组空间)。


📝 二、 插入类排序(Insertion Sort)

  • ⚖️ 算法核心与方法总结(原笔记)
  • 将整个序列划分为"有序区""无序区"。
  • 核心动作是"逐个插入":依次将无序区的元素扫描并插入到有序区的合适位置。

1. 直接插入排序

  • ⏳ 性能指标(原笔记)

  • 时间复杂度

  • 最好情况: O ( n ) O(n) O(n) (原本就已经是正序有序)

  • 最坏/平均情况: O ( n 2 ) O(n^2) O(n2)

  • 空间复杂度 : O ( 1 ) O(1) O(1)

2. 折半插入排序(Binary Insertion Sort)

  • ⏳ 性能指标(原笔记)
  • 时间复杂度 :最好情况 O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n),最坏情况 O ( n 2 ) O(n^2) O(n2)。
  • 空间复杂度 : O ( 1 ) O(1) O(1)。
  • 💡 408 考点挖坑补充:折半插入排序仅减少了"比较"的次数(优化为 O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n)),但"移动"元素的次数依然是 O ( n 2 ) O(n^2) O(n2),因此总的最坏时间复杂度仍为 O ( n 2 ) O(n^2) O(n2)。

3. 希尔排序(Shell Sort)

  • ⏳ 性能指标(原笔记)
  • 时间复杂度 :取决于步长序列的设定,一般约为 O ( n 1.3 ) O(n^{1.3}) O(n1.3),最坏情况为 O ( n 2 ) O(n^2) O(n2)。
  • 空间复杂度O ( 1 ) O(1) O(1)

📝 三、 交换类排序(Exchange Sort)

1. 冒泡排序(Bubble Sort)

  • ⚖️ 算法核心与方法总结(原笔记)

  • "一比一交换":相邻元素两两比较并进行交换。

  • "每一次把最大的放在序列尾"(或将最小的元素浮动到序列头)。

  • ⏳ 性能指标(原笔记)

  • 时间复杂度 : O ( n 2 ) O(n^2) O(n2)

  • 空间复杂度 : O ( 1 ) O(1) O(1)

2. 快速排序(Quick Sort)

  • ⚖️ 算法核心与方法总结(原笔记)

  • 基于"分治"思想。

  • "每一趟把枢轴元素放在最终位置"

  • 双指针移动口诀(做题追踪核心)"high选一个低于/小于枢轴值的,low选一个高的 ------ 直到 low = high"

  • ⏳ 性能指标(原笔记)

  • 时间复杂度 : O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n)

  • 空间复杂度(递归调用栈深度)

  • 最好情况: O ( log ⁡ 2 n ) O(\log_2 n) O(log2n)

  • 最坏情况: O ( n ) O(n) O(n) (当序列原本就有序或逆序,快排退化为冒泡)


📝 四、 选择类排序(Selection Sort)

  • ⚖️ 算法核心与方法总结(原笔记)
  • "每次选一个最(大/小)元素放到最前/后"

1. 简单选择排序(Simple Selection Sort)

  • ⏳ 性能指标(原笔记)
  • 时间复杂度 : O ( n 2 ) O(n^2) O(n2) (无论初始状态如何,元素之间的比较次数都是固定不可省的 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1))。
  • 空间复杂度 : O ( 1 ) O(1) O(1)

2. 堆排序(Heap Sort)

  • ⚖️ 结构分类(原笔记) :分为"大根堆""小根堆"。
  • 做题切入点(原笔记红字) :初始建堆时,从 ⌊ n / 2 ⌋ \\lfloor n/2 \\rfloor ⌊n/2⌋ (即最后一个非叶子节点)"开始考虑",自底向上逐步进行筛选和调整。
  • ⏳ 性能指标补充
  • 时间复杂度 :最好/最坏/平均情况均为 O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n)。
  • 空间复杂度 : O ( 1 ) O(1) O(1)。

📝 五、 归并排序与基数排序

1. 二路归并排序(2-Way Merge Sort)

  • ⏳ 性能指标(原笔记)
  • 时间复杂度 : O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n)
  • 空间复杂度O ( n ) O(n) O(n) (需要与原数组同等大小的辅助空间用于归并合并)。

2. 基数排序(Radix Sort)

  • ⚖️ 算法核心与方法总结(原笔记)

  • "低位开始分":从个位、十位、百位等低位关键字依次开始。

  • 核心步骤为"分配和收集"。

  • ⏳ 性能指标(原笔记)

  • 时间复杂度 : O ( d ( n + r ) ) O(d(n+r)) O(d(n+r)) (其中 d d d 为关键码的码数/位数, r r r 为基数/桶数,如十进制则 r = 10 r=10 r=10)。

  • 空间复杂度O ( r ) O(r) O(r) (需要 r r r 个队列做辅助空间)。


📊 📊 六、 总结:408内部排序全算法速查大表

为了方便博文读者整体复习和对比记忆,特将笔记中的性能指标提炼成下表:

排序大类 排序算法名称 最好时间复杂度 最坏时间复杂度 平均时间复杂度 空间复杂度 稳定性
插入类 直接插入排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) 稳定
折半插入排序 O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) 稳定
希尔排序 O ( n 1.3 ) O(n^{1.3}) O(n1.3) O ( n 2 ) O(n^2) O(n2) O ( n 1.3 ) O(n^{1.3}) O(n1.3) O ( 1 ) O(1) O(1) 不稳定
交换类 冒泡排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) 稳定
快速排序 O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n) O ( n 2 ) O(n^2) O(n2) O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n) O ( log ⁡ 2 n ) ∼ O ( n ) O(\log_2 n) \sim O(n) O(log2n)∼O(n) 不稳定
选择类 简单选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) 不稳定
堆排序 O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n) O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n) O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n) O ( 1 ) O(1) O(1) 不稳定
归并类 二路归并排序 O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n) O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n) O ( n log ⁡ 2 n ) O(n \log_2 n) O(nlog2n) O ( n ) O(n) O(n) 稳定
基数类 基数排序 O ( d ( n + r ) ) O(d(n+r)) O(d(n+r)) O ( d ( n + r ) ) O(d(n+r)) O(d(n+r)) O ( d ( n + r ) ) O(d(n+r)) O(d(n+r)) O ( r ) O(r) O(r) 稳定
相关推荐
Adios7942 小时前
设置交集大小至少为2
数据结构·算法·leetcode
shawxlee5 小时前
vue3在public下封装config.js自定义配置动态数据,可在打包后直接修改,方便后端部署及后续维护
前端·javascript·经验分享·vue·团队开发·js·项目优化
来一碗刘肉面8 小时前
栈的应用(表达式求值)
数据结构·算法
xiaowang1234shs9 小时前
怪兽轻断食技术深度测评:从断食计时引擎到AI识别算法的工程实践解析
数据库·人工智能·算法·macos·机器学习·p2p·visual studio
小果因子实验室9 小时前
量化研究--策略迁移算法1研究
算法
疯狂打码的少年10 小时前
【软件工程】软件质量保证(ISO/IEC 9126质量特性)
笔记
Web极客码10 小时前
如何用三段式确定性剪枝,为 LLM Agent 砍掉 35% 的 Token 成本?
服务器·人工智能·算法·机器学习
程序猿乐锅10 小时前
【数据结构与算法 | 第六篇】力扣1109,1094差分数组
java·算法·leetcode
wabs66610 小时前
关于图论【广度优先搜索的理论基础】
算法·图论·宽度优先