【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) 稳定
相关推荐
阿文的代码库1 小时前
浅谈:无向图的欧拉回路
算法
-Thinker1 小时前
AI 算法核心原理与实现
人工智能·算法·机器学习
问心无愧05131 小时前
ctf show web入门107
android·前端·笔记·android studio
Eloudy1 小时前
最小权重完美匹配(MWPM)与表面码纠错
算法·量子计算
-森屿安年-1 小时前
62. 不同路径
算法·动态规划
chase。2 小时前
【学习笔记】面向机器人食物舀取的 spillage-aware 引导扩散策略
笔记·学习·机器人
zhonghaoxincekj2 小时前
基于 168MHz MCU 的直流继电器全参数自动化测试方案解析
经验分享·功能测试·科技·学习·测试工具·创业创新·制造
学计算机的计算基2 小时前
Codex CLI vs Claude Code 全方位对比:设计哲学与用户体验深度解析
算法
欧阳x天2 小时前
八大排序算法(C语言实现)
数据结构·算法·排序算法