这个仓库记录了我从零开始学习数据结构与算法的过程。
source 里放的是每一章的代码:一部分是基础数据结构的定义和常见操作,另一部分是配套练习。练习主要来自 LeetCode、洛谷等 OJ 网站,也有跟着课程完成的题目。diary 里则是我每天写完代码后的复盘,记录当天学了什么、卡在哪里,以及后来是怎么想明白的。
这里不只收集最后能够运行的代码。我更想保留学习过程中那些逐渐连起来的线索:顺序表为什么要区分容量和元素个数,链表题为什么总是在找指针关系,括号匹配如何把栈从一个结构体变成一种思考方式,递归又是怎么在二叉树里真正派上用场的。
截至 2026-06-26,仓库里已经有这些内容:
| 章节 | 基础内容 | 练习重点 |
|---|---|---|
| 顺序表 | 动态数组、增删改查 | 二分、滑动窗口、前缀和 |
| 链表 | 单链表、循环链表、双向链表 | 反转、删倒数、环、旋转 |
| 递归函数 | 阶乘、递归出口、回溯 | 排列、组合、子集 |
| 栈与队列 | 数组栈、循环队列、链表队列 | 括号匹配、栈序列、表达式计算 |
| 二叉树 | 遍历、线索化、序列化、哈夫曼编码 | 层序遍历、树题练习 |
| 堆与优先队列 | 大/小顶堆、建堆、堆排序 | 数据流、合并链表、贪心维护、动态合并 |
| 排序算法 | 选择排序、插入排序、无监督插入排序、希尔排序、冒泡排序、快速排序 | 耗时观察、交换成本、增量序列比较、提前退出优化、双指针分区、快速排序优化 |
二叉树这一章已经暂时收尾。线索化和序列化各自重新手写过一遍,哈夫曼编码的代码实现也已经完成。这几天还补了二叉树相关的 LeetCode 练习,从普通层序遍历、自底向上层序遍历,写到锯齿形层序遍历和判断树的子结构。堆和优先队列这一章现在也正式收尾:先手写大顶堆、小顶堆、堆排序和两种建堆方式,再用小顶堆优化哈夫曼编码,最后用 set + pair 处理动态候选集合。后半段练习主要围绕动态维护展开:序列 m 小和保留每一轮最小的前 m 个部分和,生日礼物则把连续正负段压缩后,用集合和模拟链表不断删除或合并绝对值最小的段。排序算法这一章已经接上,先后实现了选择排序、插入排序、无监督插入排序、希尔排序、冒泡排序和快速排序;现在的重点不只是把数组排对,也会比较交换次数、内存写入、增量序列和数据分布对实际耗时的影响。快速排序已经从基础分区写到三点取中、单边递归和小区间插入排序收尾;冒泡排序也补了接近有序数组的测试,用来观察提前退出优化真正适合的数据条件。仓库里还新建了一个 python 文件夹,打算在期末结束后用 Python 重写一部分算法练习。
.
├─ source
│ ├─ vector
│ ├─ linked list
│ ├─ recursive_function
│ ├─ stack&queue
│ ├─ binary_tree
│ ├─ heap&priority_queue
│ └─ sort_algorithm
├─ python
├─ diary
│ ├─ vector_linklist_recursive_func
│ ├─ stack_queue
│ ├─ binary_tree
│ ├─ heap&priority_queue
│ └─ sort_algorithm
└─ .build
每个章节的源码大致分成两类:
basic_definition&operation:自己实现基础结构,并保留可单独运行的入口。exercise:围绕当前章节完成的练习题。
如果想看某个结构的实现,可以先从对应章节的基础代码开始,再看 exercise 里的题目。
如果想看学习过程,建议按日期翻 diary。日志不是教程,也没有刻意把每一天写得很顺。有时我会先跟着课程写一遍,第二天遮住代码重新实现,再把真正没懂的地方补出来。对我来说,这部分和源码同样重要。
如果不想按日期一篇篇翻,可以先从下面这些阶段代表篇看起:
- 顺序表、链表与递归函数
- 从队列写到栈,再写到括号匹配
- 表达式计算:把表达式看成一棵树
- 线索化二叉树:自己写一遍才知道哪里没有懂
- 从仓库选址到合并果子,二叉树这一章收尾
- 重写建堆,再用堆优化哈夫曼编码
- 超市利润题,把贪心流程理顺
- 序列 m 小和,把前 m 个候选维护清楚
- 重写生日礼物,再看插入排序的效率
- 堆章节收尾,转向排序算法
- 希尔排序,不只看增量序列
- 冒泡排序,优化为什么反而更慢
- 快速排序,把基准值放回正确位置
- 快速排序的四种优化,顺手验证冒泡排序的适用条件
仓库里的代码以 C/C++ 基础练习为主,多数文件可以单独编译。部分代码使用了 nullptr 和 and,建议使用 g++。
这个仓库会跟着学习进度继续长下去。写代码、做题、复盘,再回头重写一遍不够熟练的部分,是目前最适合我的节奏。