diff --git "a/docs/00-\346\216\222\345\272\217\347\256\227\346\263\225\346\226\207\346\241\243\347\274\226\345\206\231\350\247\204\350\214\203.md" "b/docs/00-\346\216\222\345\272\217\347\256\227\346\263\225\346\226\207\346\241\243\347\274\226\345\206\231\350\247\204\350\214\203.md" new file mode 100644 index 0000000..72d05ef --- /dev/null +++ "b/docs/00-\346\216\222\345\272\217\347\256\227\346\263\225\346\226\207\346\241\243\347\274\226\345\206\231\350\247\204\350\214\203.md" @@ -0,0 +1,31 @@ +# 排序算法文档编写规范 + +本文档用于约束 `docs/` 目录下排序算法教学资料的统一写法,确保现有文档与后续新增文档在命名、结构、术语和语气上保持一致。 + +#### 文档命名应遵循什么规则? + +所有排序算法教学文档都应使用“编号 + 中文标题 + `.md`”的命名方式,例如 `01-冒泡排序.md`、`15-TopK问题与排序选择.md`。编号应尽量连续,便于在 `docs/` 目录中按学习顺序阅读。 + +#### 文档标题和语言应如何统一? + +一级标题应以中文主题名为主,必要时可在括号中补充英文名称,例如“快速排序(Quick Sort)”。正文内容必须使用中文撰写,避免出现整段英文说明,以保证资料适合课程展示、学生阅读和毕业设计答辩使用。 + +#### 推荐的文档结构是什么? + +每篇文档建议遵循如下结构:(1)标题;(2)开篇导语,说明该主题在排序知识体系中的位置;(3)若干个“问题 + 回答”形式的主体小节;(4)结尾总结或教学提问建议。对于基础算法文档,重点回答“原理、复杂度、稳定性、优缺点、适用场景”;对于专题文档,可围绕“工程实践、应用场景、教学设计、学习路径”等展开。 + +#### 术语表达需要统一哪些内容? + +所有文档都应尽量统一使用以下术语:时间复杂度、空间复杂度、稳定性、原地排序、自适应性、比较排序、非比较排序、外部排序、内部排序。对于同一概念,不应在不同文档中给出相互冲突的定义。复杂度说明优先按照“最好 / 平均 / 最坏 / 空间复杂度 / 稳定性”的顺序组织。 + +#### 文档语气和风格应保持什么特点? + +整体风格应偏教学讲解型,面向排序算法学习者,强调清晰、严谨、易读。内容既要能让学生直接阅读理解,也要适合后续被 RAG 系统切片入库,因此每个问题下的回答应尽量自洽、独立,不依赖过多上下文跳转。 + +#### 新增和修改文档时应注意什么? + +修改现有文档时,以补充和统一为主,不做无必要的大幅重写。新增文档时,应优先补足现有知识体系中的空白专题,避免重复已有文档已经详细覆盖的内容。完成后应复查文件名、一级标题、结构层级和结尾样式,确保整组文档看起来像同一套教学资料。 + +#### 本规范如何使用? + +当后续需要新增或修改排序算法教学文档时,应先参考本文档确定命名、结构和术语,再开始撰写或补充。若未来文档体系继续扩展,也应优先在本文档中同步更新约束,避免不同批次文档形成两套风格。 diff --git "a/docs/01-\345\206\222\346\263\241\346\216\222\345\272\217.md" "b/docs/01-\345\206\222\346\263\241\346\216\222\345\272\217.md" index 2e88dce..6aabc37 100644 --- "a/docs/01-\345\206\222\346\263\241\346\216\222\345\272\217.md" +++ "b/docs/01-\345\206\222\346\263\241\346\216\222\345\272\217.md" @@ -1,5 +1,7 @@ # 冒泡排序(Bubble Sort) +冒泡排序通常是学习排序算法时接触到的第一种算法。它的价值不在于工程性能,而在于帮助初学者理解“比较、交换、稳定性、复杂度”这些排序算法最基础的概念,因此非常适合作为排序学习的起点。 + #### 冒泡排序的基本原理是什么? 冒泡排序是一种简单的比较排序算法。它重复地遍历待排序的序列,依次比较相邻的两个元素,如果它们的顺序不符合排序要求(例如前者大于后者),则交换它们的位置。每一轮遍历结束后,当前未排序部分的最大元素会像气泡一样"浮"到序列的末尾,因此得名冒泡排序。经过 n-1 轮遍历后,整个序列就变得有序。其核心思想是通过相邻元素的逐步交换,将较大(或较小)的元素逐渐移动到正确的位置。 @@ -25,3 +27,7 @@ #### 冒泡排序适合在哪些场景中使用? 冒泡排序适合以下场景:(1)数据规模较小(n < 100)时,其简单性优于复杂算法带来的常数开销。(2)数据近乎有序时,结合提前终止优化可以接近 O(n) 的性能。(3)教学和算法学习场景,用于理解排序的基本思想和稳定性概念。(4)对稳定性有要求且数据量极少的嵌入式场景,代码简单不易出错。在实际工程中处理大规模数据时,应优先选择快速排序、归并排序等高效算法。 + +#### 本章小结与提问建议 + +冒泡排序的核心教学价值在于“简单、直观、易观察”,它适合帮助初学者建立对排序过程的第一印象,但并不适合作为大规模数据处理的首选算法。学习本章后,可以继续追问:“为什么插入排序通常比冒泡排序更快?”以及“稳定排序在真实业务中为什么重要?” diff --git "a/docs/02-\351\200\211\346\213\251\346\216\222\345\272\217.md" "b/docs/02-\351\200\211\346\213\251\346\216\222\345\272\217.md" index 5e606aa..fec7ce6 100644 --- "a/docs/02-\351\200\211\346\213\251\346\216\222\345\272\217.md" +++ "b/docs/02-\351\200\211\346\213\251\346\216\222\345\272\217.md" @@ -1,5 +1,7 @@ # 选择排序(Selection Sort) +选择排序是另一种经典的入门排序算法。它和冒泡排序一样都属于 O(n²) 的简单排序,但它强调的是“每轮选出最值”的思路,因此很适合与冒泡排序、插入排序做横向比较,帮助学习者建立不同排序策略的直觉。 + #### 选择排序的基本原理是什么? 选择排序的核心思想是:每一轮从未排序的部分中选出最小(或最大)的元素,将其放到已排序部分的末尾。具体过程为:第 1 轮从 n 个元素中选出最小元素与第 1 个位置的元素交换;第 2 轮从剩余的 n-1 个元素中选出最小元素与第 2 个位置的元素交换;以此类推,经过 n-1 轮后整个序列有序。选择排序的特点是每一轮只进行一次交换操作,因此数据交换次数为 O(n),比冒泡排序的交换次数少很多。 @@ -25,3 +27,7 @@ #### 选择排序适合在哪些场景中使用? 选择排序适合以下场景:(1)数据规模很小(n < 50)的情况,简单实现且性能差异不明显。(2)交换操作代价高的场景,例如排序包含大量数据字段的结构体或对象,选择排序的 O(n) 交换次数远优于冒泡排序。(3)内存极度受限的嵌入式环境,O(1) 空间且代码极简。(4)不需要排序稳定性的场景。在需要处理中等或大规模数据时,应优先选择时间复杂度更优的排序算法。 + +#### 本章小结与提问建议 + +选择排序的关键特点是比较次数固定、交换次数少,但它无法利用已有序性,也不具备稳定性。学习本章后,可以进一步思考:“如果交换代价很高,为什么选择排序仍然可能有价值?”以及“选择排序和冒泡排序的本质区别是什么?” diff --git "a/docs/03-\346\217\222\345\205\245\346\216\222\345\272\217.md" "b/docs/03-\346\217\222\345\205\245\346\216\222\345\272\217.md" index caa5a90..42da95f 100644 --- "a/docs/03-\346\217\222\345\205\245\346\216\222\345\272\217.md" +++ "b/docs/03-\346\217\222\345\205\245\346\216\222\345\272\217.md" @@ -1,5 +1,7 @@ # 插入排序(Insertion Sort) +插入排序是简单排序算法中最具工程直觉的一种。它模仿人们整理扑克牌的过程,既容易理解,又能体现“输入越接近有序,算法越快”的自适应思想,因此在教学和工程优化中都很重要。 + #### 插入排序的基本原理是什么? 插入排序的核心思想类似于整理扑克牌:将序列分为已排序和未排序两部分,每次从未排序部分取出一个元素,在已排序部分中从后往前逐一比较,找到该元素应该插入的位置,将其插入到正确位置。具体地,初始时认为第一个元素已经有序,从第二个元素开始,将其与已排序部分的元素逐一比较,大于该元素的元素依次后移一位,直到找到不大于该元素的位置或到达序列头部,然后将元素插入到空出的位置。 @@ -25,3 +27,7 @@ #### 插入排序在实际工程中有哪些应用? 插入排序在实际工程中有广泛应用:(1)**TimSort 的组成部分**:Python 和 Java 的默认排序算法 TimSort 使用插入排序对小于 64 的子数组进行排序。(2)**IntroSort 的兜底**:C++ STL 的 `std::sort` 使用 IntroSort,当递归深度过大或子数组足够小时切换为插入排序。(3)**小规模数据排序**:当数据量小于某个阈值(通常 16~64)时,插入排序的常数因子优势使其快于递归开销较大的快速排序。(4)**在线数据流排序**:需要对流式数据进行实时排序维护时,插入排序的在线特性非常适合。 + +#### 本章小结与提问建议 + +插入排序展示了“简单算法不一定没有工程价值”这一点。它在大规模乱序数据上不够高效,但在小规模、近乎有序或需要在线处理的场景中非常有用。学习本章后,可以继续追问:“为什么高级排序算法常常在最后切换为插入排序?” diff --git "a/docs/04-\345\270\214\345\260\224\346\216\222\345\272\217.md" "b/docs/04-\345\270\214\345\260\224\346\216\222\345\272\217.md" index 1e14561..8265954 100644 --- "a/docs/04-\345\270\214\345\260\224\346\216\222\345\272\217.md" +++ "b/docs/04-\345\270\214\345\260\224\346\216\222\345\272\217.md" @@ -1,5 +1,7 @@ # 希尔排序(Shell Sort) +希尔排序可以看作插入排序的“加速版”。它通过增量分组的方式先让数据大致有序,再在最后一轮用插入排序完成收尾,因此非常适合用来理解“优化简单算法”的思路。 + #### 希尔排序的基本原理是什么? 希尔排序是插入排序的改进版本,也称为"缩小增量排序"。其核心思想是:先将整个序列按照一个较大的增量(gap)分成若干个子序列,对每个子序列分别进行插入排序,使得元素可以快速跨越多个位置移动;然后逐步缩小增量,继续对各子序列进行插入排序;当增量缩小到 1 时,整个序列已经基本有序,此时进行最后一次标准插入排序即可快速完成。希尔排序的精髓在于,通过先处理间距较大的元素对比和移动,使序列快速趋于有序,从而克服了普通插入排序只能逐个移动元素的缺陷。 @@ -25,3 +27,7 @@ #### 希尔排序适合在哪些场景中使用? 希尔排序适合以下场景:(1)中等规模数据排序,当数据量在几千到几万之间时,希尔排序实现简单且性能优于 O(n²) 算法。(2)嵌入式系统或资源受限环境,不需要额外内存且代码实现紧凑。(3)不需要排序稳定性的场景。(4)作为快速排序的补充,某些实现中在子数组较小时切换为希尔排序。在现代工程实践中,希尔排序已较少被直接使用,更多作为算法教学中的重要一环。 + +#### 本章小结与提问建议 + +希尔排序的重点不只是记住某个复杂度,而是理解“通过增量让序列逐步接近有序”的思想。它连接了简单排序和高效排序之间的认知桥梁。学习本章后,可以继续思考:“增量序列为什么会显著影响性能?” diff --git "a/docs/05-\345\275\222\345\271\266\346\216\222\345\272\217.md" "b/docs/05-\345\275\222\345\271\266\346\216\222\345\272\217.md" index 76417bc..fa42637 100644 --- "a/docs/05-\345\275\222\345\271\266\346\216\222\345\272\217.md" +++ "b/docs/05-\345\275\222\345\271\266\346\216\222\345\272\217.md" @@ -1,5 +1,7 @@ # 归并排序(Merge Sort) +归并排序是分治思想在排序领域中最经典的代表。它不仅复杂度稳定,而且天然适合链表排序、外部排序和并行化处理,因此既是算法课程中的重点,也是工程实践中的重要基础。 + #### 归并排序的基本原理是什么? 归并排序采用分治(Divide and Conquer)策略。它将序列递归地拆分为两个子序列,分别排序后再合并(Merge)。具体步骤为:(1)**分解**:将长度为 n 的序列从中间拆分为两个长度约为 n/2 的子序列。(2)**递归排序**:对两个子序列分别递归地应用归并排序。(3)**合并**:将两个已排序的子序列合并为一个有序序列。合并过程中,使用两个指针分别指向两个子序列的头部,每次选取较小的元素放入结果序列,直到所有元素合并完毕。递归的终止条件是子序列长度小于等于 1。 @@ -25,3 +27,7 @@ #### 归并排序和快速排序应该如何选择? 归并排序和快速排序各有适用场景:(1)**稳定性要求**:需要稳定排序时选归并排序,快速排序不稳定。(2)**最坏情况性能**:要求最坏情况也是 O(n log n) 时选归并排序,快速排序最坏为 O(n²)。(3)**内存限制**:内存紧张时选快速排序(O(log n) 栈空间),归并排序需要 O(n) 额外空间。(4)**平均性能**:在数组上的平均性能,经过优化的快速排序通常优于归并排序(缓存友好性更好)。(5)**外部排序**:数据无法全部载入内存时选归并排序。(6)**链表排序**:链表上归并排序是首选,快速排序在链表上效率较差。Java 对对象数组使用 TimSort(基于归并排序),对基本类型数组使用双轴快速排序。 + +#### 本章小结与提问建议 + +归并排序体现了“分而治之”的强大威力,它在最坏情况下仍能保持 O(n log n),同时兼具稳定性,因此在很多场景中比快速排序更可靠。学习本章后,可以继续追问:“为什么归并排序适合外部排序和链表排序?” diff --git "a/docs/06-\345\277\253\351\200\237\346\216\222\345\272\217.md" "b/docs/06-\345\277\253\351\200\237\346\216\222\345\272\217.md" index 051ac7b..0d30b5d 100644 --- "a/docs/06-\345\277\253\351\200\237\346\216\222\345\272\217.md" +++ "b/docs/06-\345\277\253\351\200\237\346\216\222\345\272\217.md" @@ -1,5 +1,7 @@ # 快速排序(Quick Sort) +快速排序是实际工程中最具代表性的高效排序算法之一。它平均性能优秀、缓存友好、优化手段丰富,因此在标准库和面试题中都非常常见,也是学习分治思想和分区操作的重点内容。 + #### 快速排序的基本原理是什么? 快速排序基于分治策略,其核心操作是"分区"(Partition)。具体步骤为:(1)**选取基准值(Pivot)**:从序列中选择一个元素作为基准值。(2)**分区操作**:将序列重新排列,使得所有小于基准值的元素放在基准值左边,所有大于基准值的元素放在基准值右边,基准值被放到最终正确的位置。(3)**递归排序**:对基准值左右两边的子序列递归地应用快速排序。与归并排序"先分后合"不同,快速排序是"先排后分"——在分区过程中就完成了元素的大致排序,不需要合并步骤。 @@ -25,3 +27,7 @@ #### 快速排序为什么在实际应用中比归并排序更受欢迎? 快速排序在实际工程中更受欢迎主要有以下原因:(1)**缓存友好性**:快速排序在连续内存上顺序访问数据,CPU 缓存命中率高;而归并排序需要在原数组和辅助数组之间来回复制,缓存利用率较低。(2)**空间效率**:快速排序是原地排序只需 O(log n) 栈空间,归并排序需要 O(n) 辅助空间。(3)**常数因子小**:快速排序的内循环(比较和交换)操作非常简单高效。(4)**优化成熟**:IntroSort 等变体已经消除了最坏情况的风险。然而在需要稳定性或外部排序的场景中,归并排序仍是更好的选择。 + +#### 本章小结与提问建议 + +快速排序的核心优势在于平均性能高、工程优化成熟,但它也有最坏情况退化和不稳定性的问题。学习本章后,可以进一步思考:“为什么随机化 Pivot 可以降低最坏情况风险?”以及“什么场景下应该优先选择归并排序而不是快速排序?” diff --git "a/docs/07-\345\240\206\346\216\222\345\272\217.md" "b/docs/07-\345\240\206\346\216\222\345\272\217.md" index 90d58c6..6ef362a 100644 --- "a/docs/07-\345\240\206\346\216\222\345\272\217.md" +++ "b/docs/07-\345\240\206\346\216\222\345\272\217.md" @@ -1,5 +1,7 @@ # 堆排序(Heap Sort) +堆排序展示了“数据结构如何直接服务于算法设计”。它利用堆这种完全二叉树结构,将“不断选出当前最大值”这个过程高效化,因此特别适合帮助学习者理解堆、优先队列和 O(n log n) 排序之间的关系。 + #### 堆排序的基本原理是什么? 堆排序利用"堆"这种数据结构进行排序。堆是一棵完全二叉树,分为最大堆(每个节点的值大于等于其子节点)和最小堆(每个节点的值小于等于其子节点)。堆排序的过程分两个阶段:(1)**建堆**:将无序数组原地构建为一个最大堆,从最后一个非叶子节点开始,逐个执行"下沉"(Sift Down)操作,时间复杂度为 O(n)。(2)**排序**:反复将堆顶(最大值)与堆的末尾元素交换,然后将堆大小减 1 并对新的堆顶执行下沉操作以恢复堆性质。每次操作确定一个元素的最终位置,经过 n-1 次交换后,数组变为升序。整个堆排序利用了数组下标即可表示父子关系的特性,不需要额外的指针。 @@ -25,3 +27,7 @@ #### 堆排序和快速排序应该如何选择? 堆排序和快速排序的选择取决于具体需求:(1)**性能追求**:追求平均最快速度选快速排序,其缓存友好性和较小的常数因子使其在大多数情况下更快。(2)**最坏保证**:要求确定性的 O(n log n) 保证选堆排序,特别是在安全敏感场景中防止恶意输入导致的排序退化攻击。(3)**空间限制**:两者都是原地排序,但堆排序的 O(1) 优于快速排序的 O(log n) 栈空间。(4)**数据特征**:重复元素多时选三路快排;需要 Top-K 时选堆排序。(5)**最佳实践**:现代标准库通常使用 IntroSort,结合两者优点——先快排,深度过大时切堆排,小规模切插入排序。 + +#### 本章小结与提问建议 + +堆排序的价值在于同时满足“最坏 O(n log n)”和“额外空间 O(1)”,这使它在理论上非常重要。学习本章后,可以继续追问:“为什么堆排序虽然复杂度优秀,但实际常数因子通常大于快速排序?”以及“堆排序与 Top-K 问题之间有什么联系?” diff --git "a/docs/08-\345\237\272\346\225\260\346\216\222\345\272\217.md" "b/docs/08-\345\237\272\346\225\260\346\216\222\345\272\217.md" index ba6bfb6..175b77e 100644 --- "a/docs/08-\345\237\272\346\225\260\346\216\222\345\272\217.md" +++ "b/docs/08-\345\237\272\346\225\260\346\216\222\345\272\217.md" @@ -1,5 +1,7 @@ # 基数排序(Radix Sort) +基数排序是典型的非比较排序,它帮助学习者理解一个关键事实:排序并不总是依赖元素两两比较。在特定数据条件下,基数排序可以突破比较排序的 O(n log n) 下界,因此是扩展排序知识体系的重要一章。 + #### 基数排序的基本原理是什么? 基数排序是一种非比较排序算法,它不通过元素之间的直接比较来确定顺序,而是根据元素的各个"位"(digit)来分配和收集。具体过程为:(1)确定所有元素的最大位数 d(例如最大数是 999,则 d=3)。(2)从最低位(个位)开始,依次对每一位进行稳定的分配和收集——将所有元素按照当前位的值分配到 0~9 共 10 个桶中,然后按桶的顺序依次收集元素。(3)对十位、百位...依次重复上述操作。经过 d 轮分配-收集后,序列变为有序。这种"从低位到高位"的方式称为 LSD(Least Significant Digit)基数排序;也有从高位到低位的 MSD 方式。 @@ -25,3 +27,7 @@ #### 基数排序适合在哪些场景中使用? 基数排序适合以下场景:(1)**大量整数排序**:排序百万到上亿级别的整数数据(如 ID、时间戳),当数据位数固定时效率极高。(2)**字符串排序**:对定长字符串(如电话号码、身份证号、IP 地址)进行排序。(3)**多关键字排序**:需要按多个关键字排序时(如先按年龄再按姓名),基数排序的多轮处理天然适合。(4)**数据库索引构建**:某些数据库引擎使用基数排序构建索引。(5)**后缀数组构建**:部分后缀数组构建算法使用基数排序作为基础组件。不适合的场景包括:浮点数排序(位表示与数值顺序不一致)、数据位数差异极大的场景、数据量很小的场景。 + +#### 本章小结与提问建议 + +基数排序的重要意义在于帮助学习者跳出“排序一定靠比较”的固有印象。它在整数、定长字符串等场景中效率极高,但适用条件也更严格。学习本章后,可以继续思考:“基数排序和计数排序、桶排序之间到底是什么关系?” diff --git "a/docs/09-\346\216\222\345\272\217\347\256\227\346\263\225\347\273\274\345\220\210\345\257\271\346\257\224.md" "b/docs/09-\346\216\222\345\272\217\347\256\227\346\263\225\347\273\274\345\220\210\345\257\271\346\257\224.md" index 71bade3..b577d67 100644 --- "a/docs/09-\346\216\222\345\272\217\347\256\227\346\263\225\347\273\274\345\220\210\345\257\271\346\257\224.md" +++ "b/docs/09-\346\216\222\345\272\217\347\256\227\346\263\225\347\273\274\345\220\210\345\257\271\346\257\224.md" @@ -1,5 +1,7 @@ # 排序算法综合对比 +当学习完多种排序算法后,真正重要的问题不再是“某个算法怎么写”,而是“它和别的算法相比有什么区别”。本章以综合对比为核心,帮助学习者从全局视角理解不同排序算法的性能、稳定性和适用场景。 + #### 八大排序算法的时间复杂度和空间复杂度如何对比? 八大排序算法的复杂度对比如下: @@ -36,3 +38,7 @@ #### 在实际编程语言和框架中,标准库使用了什么排序算法? 主流编程语言的标准库排序实现如下:(1)**Java**:`Arrays.sort()` 对基本类型使用双轴快速排序(Dual-Pivot Quicksort),对对象类型使用 TimSort(基于归并排序的优化版,保证稳定性)。(2)**Python**:内置 `sort()` 和 `sorted()` 使用 TimSort。(3)**C++**:`std::sort()` 使用 IntroSort(快速排序 + 堆排序 + 插入排序的混合体),`std::stable_sort()` 使用归并排序。(4)**Go**:`sort.Sort()` 使用 Pattern-Defeating Quicksort(pdqsort),融合了快速排序和堆排序。(5)**Rust**:`sort()` 稳定排序使用 TimSort 变体,`sort_unstable()` 使用 pdqsort。这些实现都不是单一算法,而是多种排序算法的组合,根据数据规模和特征动态选择最优策略。 + +#### 本章小结 + +综合比较的价值在于帮助学习者建立“根据约束选算法”的思维方式,而不是机械记忆结论。学习本章后,应能根据数据规模、稳定性要求、内存限制和数据类型快速判断更合适的排序方案。 diff --git "a/docs/10-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\267\245\347\250\213\345\256\236\350\267\265.md" "b/docs/10-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\267\245\347\250\213\345\256\236\350\267\265.md" index 84f858a..31188d1 100644 --- "a/docs/10-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\267\245\347\250\213\345\256\236\350\267\265.md" +++ "b/docs/10-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\267\245\347\250\213\345\256\236\350\267\265.md" @@ -1,5 +1,7 @@ # 排序算法的工程实践 +排序算法一旦走出课堂,就不再只是“背复杂度”这么简单。本章聚焦工程实践,帮助学习者理解为什么标准库不直接使用单一排序算法,以及工程系统会如何组合多种排序思想来获得更好的实际表现。 + #### 什么是 TimSort?它为什么被 Java 和 Python 选为默认排序算法? TimSort 是由 Tim Peters 于 2002 年为 Python 设计的混合排序算法,随后被 Java SE 7 采纳为对象数组的默认排序。其核心思想是结合归并排序和插入排序的优势:(1)**扫描 Run**:遍历数组,识别已有的升序或降序片段(Run),利用数据中已存在的有序性。(2)**扩展短 Run**:如果识别到的 Run 长度小于 minRun(通常 32~64),使用二分插入排序将其扩展到 minRun 长度。(3)**归并 Run**:将多个 Run 按照特定策略(Run 栈规则)进行归并合并。TimSort 被广泛采用的原因:最好情况 O(n)(对已排序数据)、最坏情况 O(n log n)、稳定排序、对"真实世界数据"(含大量局部有序片段)的性能优于标准归并排序和快速排序。 @@ -23,3 +25,7 @@ IntroSort(内省排序)是 David Musser 于 1997 年提出的混合排序算 #### 什么是排序算法的比较排序下界?为什么比较排序不可能比 O(n log n) 更快? 比较排序的下界定理证明:任何基于比较的排序算法在最坏情况下至少需要 ⌈log₂(n!)⌉ 次比较,即 Ω(n log n)。证明思路基于决策树模型:排序过程可以表示为一棵二叉决策树,每个内部节点代表一次比较操作,每个叶子节点代表一种可能的排列结果。n 个元素有 n! 种排列,因此决策树至少有 n! 个叶子节点。一棵高度为 h 的二叉树最多有 2^h 个叶子,所以 2^h ≥ n!,推导得 h ≥ log₂(n!)。由 Stirling 公式 log₂(n!) ≈ n log₂n - n log₂e,因此 h = Ω(n log n)。这意味着在最坏情况下,任何比较排序都不可能比 O(n log n) 更快。突破这个下界的唯一途径是使用非比较排序(如计数排序、基数排序),它们利用数据的值域特征绕过了比较操作。 + +#### 本章小结 + +工程实践中的排序算法往往不是单一算法,而是根据数据规模、分布特征、递归深度和稳定性要求做动态组合。学习本章后,应重点理解 TimSort、IntroSort 等工业级方案背后的设计取舍,而不是只停留在理论复杂度层面。 diff --git "a/docs/11-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257.md" "b/docs/11-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257.md" index b52c786..32f026e 100644 --- "a/docs/11-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257.md" +++ "b/docs/11-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257.md" @@ -1,5 +1,7 @@ # 排序算法的应用场景 +排序算法的重要性不仅体现在算法课本中,更体现在数据库、搜索引擎、操作系统、前端系统和大数据平台的具体实现里。本章的目标是帮助学习者把“排序算法”从抽象知识点,连接到真实软件系统中的具体任务。 + #### 排序算法在数据库系统中有哪些应用? 排序是数据库系统的核心操作之一,广泛应用于以下场景:(1)**ORDER BY 查询**:SQL 的 ORDER BY 子句需要对查询结果排序,数据库引擎根据数据规模和内存容量选择内部排序(快速排序/TimSort)或外部多路归并排序。(2)**索引构建**:B+树索引的叶子节点按键值有序排列,创建索引时需要对数据排序。大批量索引构建常使用外部归并排序。(3)**JOIN 操作**:Sort-Merge Join 算法先对两张表按 JOIN 键排序,然后通过归并方式匹配记录,适合大表关联。(4)**去重(DISTINCT)**:将数据排序后,相同值的元素相邻,一次遍历即可去除重复项。(5)**分组聚合(GROUP BY)**:排序后相同组的记录连续排列,有利于流式聚合计算。MySQL 8.0 使用基于归并排序的外部排序实现 `filesort`。 @@ -23,3 +25,7 @@ #### 排序算法在大数据处理中有哪些应用? 大数据场景对排序有独特的需求和解决方案:(1)**MapReduce Shuffle**:Map 阶段输出的键值对按 Key 排序分组,再分发到 Reduce 节点。Hadoop 使用外部归并排序处理超出内存的 Map 输出。(2)**分布式排序**:对跨多台机器的海量数据排序,如 Google 的 MapReduce 论文中描述的 TB 级排序。核心策略是采样确定分区边界、各节点局部排序、多路归并全局排序。(3)**流式 Top-K**:在实时数据流中维护前 K 大/小的元素,使用大小为 K 的堆,每个新元素到来时 O(log K) 更新,总时间 O(n log K)。(4)**时序数据排序**:IoT 和监控数据按时间戳排序存储,利用数据的时间局部有序性可以使用 TimSort 高效处理。(5)**数据库的批量导入**:将 CSV 等批量数据按主键排序后导入数据库,可以大幅提高 B+树索引的构建效率(顺序插入 vs 随机插入)。 + +#### 本章小结 + +理解应用场景的意义,在于让学习者知道排序算法并不是孤立的题目,而是很多系统能力的底层支撑。学习本章后,可以进一步延伸提问:“为什么数据库和搜索引擎都高度依赖外部排序和 Top-K 思想?” diff --git "a/docs/12-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\351\235\242\350\257\225\351\253\230\351\242\221\351\227\256\351\242\230.md" "b/docs/12-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\351\235\242\350\257\225\351\253\230\351\242\221\351\227\256\351\242\230.md" index dc94881..d5d8942 100644 --- "a/docs/12-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\351\235\242\350\257\225\351\253\230\351\242\221\351\227\256\351\242\230.md" +++ "b/docs/12-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\351\235\242\350\257\225\351\253\230\351\242\221\351\227\256\351\242\230.md" @@ -1,5 +1,7 @@ # 排序算法的面试高频问题 +面试中的排序问题通常不会只考“写出某个排序代码”,而是更关注复杂度分析、场景选择、边界处理和工程意识。本章将常见高频问题集中整理,帮助学习者把排序知识转化为更具表达力的面试答案。 + #### 如何在 O(n) 时间内对一个包含大量重复值的数组排序? 当数组中元素的值域范围有限(如年龄 0~150、成绩 0~100)时,可以使用计数排序在 O(n) 时间内完成排序。具体步骤:(1)统计每个值出现的次数,存入计数数组 `count[value]`。(2)对计数数组做前缀和,`count[i]` 表示值小于等于 i 的元素总数,即值 i 在排序结果中的最后位置。(3)从后向前遍历原数组,将每个元素放到计数数组指示的位置,同时将对应计数减 1。从后向前遍历保证了稳定性。时间复杂度 O(n + k)(k 为值域范围),空间复杂度 O(n + k)。如果值域很大(如 int 范围),计数排序不适用,此时应考虑三路快排或基数排序。 @@ -23,3 +25,7 @@ #### 什么是排序的"原地"特性?为什么它在实际应用中很重要? 原地排序(In-Place Sort)是指排序过程中只使用 O(1) 或 O(log n) 的额外空间,不需要与输入规模成正比的辅助存储。原地排序算法包括冒泡排序、选择排序、插入排序、希尔排序、堆排序和快速排序。非原地排序包括归并排序(O(n) 辅助数组)和基数排序(O(n+k) 辅助空间)。原地特性在以下场景中尤为重要:(1)**嵌入式系统**:内存极度受限(如 KB 级),无法分配大块辅助空间。(2)**实时系统**:动态内存分配可能引入不可预测的延迟(GC 暂停),原地排序避免了这个问题。(3)**大数据场景**:当数据刚好能放入内存时,原地排序节省的空间可以用来处理更多数据。(4)**缓存效率**:原地排序在单一数组上操作,数据局部性好,缓存命中率高。堆排序是唯一同时满足"最坏 O(n log n)"和"O(1) 空间"的比较排序算法。 + +#### 本章小结 + +面试中的排序题考察的不只是算法记忆,更考察你是否理解“为什么这样选、这样写、这样分析”。学习本章后,建议继续训练把复杂度、稳定性、原地性和适用场景放到同一个回答框架里表达清楚。 diff --git "a/docs/13-\350\256\241\346\225\260\346\216\222\345\272\217.md" "b/docs/13-\350\256\241\346\225\260\346\216\222\345\272\217.md" new file mode 100644 index 0000000..ae691d5 --- /dev/null +++ "b/docs/13-\350\256\241\346\225\260\346\216\222\345\272\217.md" @@ -0,0 +1,36 @@ +# 计数排序(Counting Sort) + +计数排序是理解非比较排序最好的起点之一。它通过“统计每个值出现了多少次”来完成排序,非常适合帮助学习者理解为什么某些排序可以突破比较排序的 O(n log n) 下界。 + +#### 计数排序的基本原理是什么? + +计数排序的核心思想是:不直接比较元素大小,而是统计每个值出现的次数。具体过程为:(1)遍历原数组,统计每个元素出现的频次,存入计数数组 `count`。(2)对计数数组做前缀和,得到每个值在排序结果中的最终边界位置。(3)从后向前遍历原数组,将每个元素放到结果数组的正确位置。这样就可以在线性时间内完成排序。 + +#### 计数排序的时间复杂度和空间复杂度分别是多少? + +计数排序的时间复杂度为 O(n + k),其中 n 是元素个数,k 是数据值域范围;空间复杂度同样为 O(n + k),因为既需要长度为 n 的结果数组,也需要长度为 k 的计数数组。当 k 远小于 n log n 时,计数排序通常比比较排序更高效。 + +#### 计数排序是稳定排序吗?为什么? + +计数排序可以是稳定排序,前提是构造结果数组时按照“从后向前遍历原数组”的方式放置元素。这样做可以保证值相等的元素在排序前后的相对顺序不变,因此它经常被作为基数排序每一轮的稳定子过程。 + +#### 计数排序适用于哪些数据? + +计数排序适用于整数数据,且要求值域范围较小、可直接映射为数组下标。例如年龄、考试成绩、等级编码、较小范围内的编号等,都是计数排序的典型应用场景。如果值域过大,例如元素分布在整个 `int` 范围内,计数数组会造成巨大的空间浪费。 + +#### 计数排序有哪些优点和缺点? + +**优点:** (1)当值域可控时,时间复杂度接近 O(n)。(2)不依赖元素比较,可以突破比较排序下界。(3)可保持稳定性,适合做多关键字排序的基础组件。(4)实现思想清晰,适合教学展示。 +**缺点:** (1)只适用于整数或可离散映射的数据。(2)当值域很大时,空间消耗过高。(3)不是原地排序,需要额外结果数组。(4)通用性不如快速排序、归并排序等比较排序。 + +#### 计数排序和基数排序、桶排序有什么区别? + +计数排序直接针对“值本身”做频次统计;基数排序是按“位”多轮使用稳定排序;桶排序则是先把元素分配到多个桶中,再对桶内元素排序。三者都属于非比较排序,但适用前提不同。可以把计数排序看作最直接、条件也最严格的一种非比较排序。 + +#### 计数排序适合在哪些教学或工程场景中使用? + +在教学中,计数排序非常适合用来解释“值域换时间”的思想;在工程中,它常用于成绩统计、日志等级排序、有限状态编码排序,以及作为基数排序的底层稳定子过程。如果数据值域清晰、重复元素较多,计数排序往往非常高效。 + +#### 本章小结与提问建议 + +计数排序的重要意义在于让学习者理解:排序不一定要比较大小,有时只要利用值域信息就能大幅提升效率。学习本章后,可以继续追问:“为什么计数排序可以做到 O(n)?”以及“什么时候值域过大就不适合使用计数排序?” diff --git "a/docs/14-\346\241\266\346\216\222\345\272\217.md" "b/docs/14-\346\241\266\346\216\222\345\272\217.md" new file mode 100644 index 0000000..49b82a4 --- /dev/null +++ "b/docs/14-\346\241\266\346\216\222\345\272\217.md" @@ -0,0 +1,36 @@ +# 桶排序(Bucket Sort) + +桶排序是一种非常依赖数据分布特征的非比较排序。它的核心思想不是直接把所有元素排好,而是先“分桶”,再在每个桶内分别排序,因此很适合帮助学习者理解“利用数据分布做加速”的思路。 + +#### 桶排序的基本原理是什么? + +桶排序的过程通常分为三步:(1)根据映射规则把元素分配到若干个桶中。(2)分别对每个桶中的元素排序,桶内可以使用插入排序、快速排序或其他合适算法。(3)按桶的顺序依次合并结果。只要映射函数设计合理,元素能较均匀地落入各桶,整体排序效率就会很高。 + +#### 桶排序的时间复杂度和空间复杂度分别是多少? + +桶排序的平均时间复杂度通常可以达到 O(n),但前提是元素分布较为均匀、桶划分合理。最坏情况下,如果所有元素都落入同一个桶中,桶排序会退化到桶内排序算法的复杂度,例如 O(n²) 或 O(n log n)。空间复杂度一般为 O(n + k),其中 k 是桶的数量。 + +#### 桶排序为什么依赖数据分布? + +桶排序的效率来自“分而治之”。如果数据分布均匀,每个桶里的元素都很少,桶内排序的代价就很小;但如果数据严重倾斜,大量元素堆积在少数几个桶中,桶内排序成本会迅速升高。因此,桶排序不是对所有输入都稳定高效,而是一种强依赖数据分布假设的算法。 + +#### 桶排序和计数排序、基数排序有什么区别? + +计数排序直接统计每个值出现次数;基数排序按位做多轮稳定排序;桶排序则先把元素映射到区间桶,再对桶内元素排序。桶排序比计数排序更灵活,因为桶内可以继续使用其他算法;但也比计数排序更依赖映射策略设计,分析难度更高。 + +#### 桶排序适合哪些场景? + +桶排序适合数据分布较均匀的场景,例如 `[0, 1)` 区间内均匀分布的小数排序、分数段统计、某些近似均匀分布的业务指标排序等。它也适合用来讲解“数据特征影响算法选择”这一重要思想。 + +#### 桶排序有哪些优点和缺点? + +**优点:** (1)在理想分布下平均效率很高,可接近 O(n)。(2)思路直观,便于解释分治和局部排序思想。(3)桶内算法可灵活替换。 +**缺点:** (1)最坏情况可能退化严重。(2)对桶划分策略依赖强。(3)空间开销不低。(4)不适合作为通用排序算法直接替代快速排序或归并排序。 + +#### 在教学系统中如何解释桶排序? + +讲解桶排序时,可以用“把学生按分数段分到不同教室,再分别排队,最后按教室顺序合并”这样的类比。这样能帮助学习者迅速理解:桶排序本质上是在利用“先分类,再局部排序”的结构化思维。 + +#### 本章小结与提问建议 + +桶排序提醒我们,算法效率往往和数据分布密切相关,而不是只由代码本身决定。学习本章后,可以继续追问:“什么时候桶排序会退化?”以及“桶内排序应该选什么算法更合适?” diff --git "a/docs/15-TopK\351\227\256\351\242\230\344\270\216\346\216\222\345\272\217\351\200\211\346\213\251.md" "b/docs/15-TopK\351\227\256\351\242\230\344\270\216\346\216\222\345\272\217\351\200\211\346\213\251.md" new file mode 100644 index 0000000..4dd35b4 --- /dev/null +++ "b/docs/15-TopK\351\227\256\351\242\230\344\270\216\346\216\222\345\272\217\351\200\211\346\213\251.md" @@ -0,0 +1,35 @@ +# TopK问题与排序选择 + +TopK 是排序思想在工程和面试中最常见的延伸问题之一。它的关键不在于“把全部数据排好”,而在于“只找出前 K 大或前 K 小”,因此非常适合帮助学习者理解为什么很多场景并不需要全量排序。 + +#### 什么是 TopK 问题? + +TopK 问题是指:在一组数据中,只需要找出最大或最小的前 K 个元素,而不要求把所有元素完全排好序。例如热门文章前 10 名、销售额最高的前 20 个商品、搜索结果的前 50 条记录,都属于典型的 TopK 场景。 + +#### 为什么 TopK 不一定要全量排序? + +如果只是找前 K 个元素,对全部 n 个元素做完整排序通常会产生不必要的计算。全量排序的典型复杂度是 O(n log n),但很多 TopK 解法可以做到 O(n log K) 甚至平均 O(n),因此在 K 远小于 n 时优势非常明显。 + +#### 解决 TopK 问题有哪些常见方法? + +常见方法有三类:(1)**全量排序**:先排序再取前 K 个,思路简单但开销较大。(2)**最小堆 / 最大堆**:维护大小为 K 的堆,遍历所有元素,时间复杂度 O(n log K),非常适合数据流场景。(3)**快速选择(Quickselect)**:基于快速排序的分区思想,平均时间复杂度 O(n),适合一次性查询。除此之外,还有最坏 O(n) 的 BFPRT 算法,但实现复杂、工程中较少直接使用。 + +#### 堆方法为什么特别适合工程场景? + +堆方法最大的优势是可以边读数据边更新结果,不需要一次性把所有数据都排好。因此它特别适合日志流、实时监控、排行榜和搜索结果截断等在线场景。堆的大小只与 K 有关,这让它在内存控制上也很有优势。 + +#### 快速选择和快速排序有什么关系? + +快速选择继承了快速排序的分区思想,但每次分区后只递归进入包含目标位置的那一边,而不是左右两边都递归。因此它减少了大量不必要的计算,在平均情况下可以在线性时间内找到第 K 大元素或把数组划分出前 K 个区间。 + +#### TopK 问题在真实系统中有哪些应用? + +TopK 广泛应用于搜索引擎结果截断、推荐系统候选集筛选、排行榜、数据库查询优化、日志告警系统、热门内容统计等场景。很多系统实际上并不追求“全排序”,而是追求“快速拿到最重要的前几个结果”。 + +#### 面试中如何回答 TopK 问题更完整? + +面试回答时,建议同时说明三点:(1)如果只图简单,可以先排序;(2)如果 K 远小于 n,更推荐堆;(3)如果追求理论最优平均复杂度,可以用快速选择。这样能体现你不仅会写代码,还知道如何根据场景做方法选择。 + +#### 本章小结与提问建议 + +TopK 问题的核心价值在于训练“不是所有问题都要全量排序”的思维。学习本章后,可以继续追问:“什么时候应该用堆,什么时候应该用快速选择?”以及“为什么搜索系统往往只返回 TopK 结果?” diff --git "a/docs/16-\345\244\226\351\203\250\346\216\222\345\272\217\344\270\216\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" "b/docs/16-\345\244\226\351\203\250\346\216\222\345\272\217\344\270\216\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" new file mode 100644 index 0000000..10c0b02 --- /dev/null +++ "b/docs/16-\345\244\226\351\203\250\346\216\222\345\272\217\344\270\216\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" @@ -0,0 +1,35 @@ +# 外部排序与海量数据处理 + +当数据量大到无法一次性装入内存时,普通的内部排序算法就不够用了。外部排序的核心任务,是在磁盘和内存协同工作的前提下,高效地完成海量数据排序,因此它是连接算法理论和大数据工程的重要主题。 + +#### 什么是外部排序? + +外部排序是指:待排序数据规模超过内存容量,必须借助磁盘等外部存储完成排序。与“内部排序”不同,外部排序需要重点考虑 I/O 成本,而不仅仅是 CPU 计算复杂度。 + +#### 外部排序的基本流程是什么? + +经典外部排序通常分为两步:(1)**生成初始有序段(Run)**:把大文件切分成多个可以放入内存的小块,对每块在内存中排序后写回磁盘。(2)**多路归并**:同时读取多个有序段,反复选出当前最小元素写入结果文件,直到全部合并完成。整个过程的核心思想仍然是归并排序,只不过把“数组”换成了“磁盘文件块”。 + +#### 为什么外部排序通常使用多路归并? + +如果每次只做二路归并,归并轮数会很多,磁盘读写次数也会很高。多路归并可以一次合并更多有序段,从而减少归并层数,降低总 I/O 成本。因此,多路归并是外部排序中的关键优化手段。 + +#### 最小堆在外部排序中起什么作用? + +在 K 路归并时,需要不断从 K 个有序段的当前头元素中选出最小值。用最小堆维护这 K 个候选元素,可以把每次取最小和插入新元素的复杂度控制在 O(log K),这是外部排序高效运行的重要基础。 + +#### 外部排序和内部排序的最大区别是什么? + +内部排序关注的是时间复杂度和空间复杂度,而外部排序更关注 I/O 轮次、磁盘访问模式和缓冲区利用率。很多在内存中高效的算法,到了磁盘场景下并不一定适用;相反,归并排序因为访问顺序稳定、便于分块处理,成为外部排序的核心方法。 + +#### 外部排序在真实系统中有哪些应用? + +外部排序广泛应用于数据库索引构建、大文件排序、搜索引擎倒排索引合并、MapReduce 的 Shuffle 阶段、日志归档处理和数据仓库批处理等场景。只要数据规模超过单机内存,外部排序思想几乎都会出现。 + +#### 学习外部排序时最容易忽略什么? + +很多学习者会把注意力只放在“算法步骤”上,却忽略“磁盘 I/O 才是真正瓶颈”。外部排序最重要的不是单次比较有多快,而是怎样减少文件读写次数、提高顺序访问比例,以及怎样合理利用缓冲区。 + +#### 本章小结与提问建议 + +外部排序说明了一件很重要的事:当问题规模变化后,算法关注点也会跟着变化。学习本章后,可以继续追问:“为什么外部排序通常基于归并思想?”以及“多路归并为什么能减少 I/O 成本?” diff --git "a/docs/17-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\217\257\350\247\206\345\214\226\346\225\231\345\255\246\350\256\276\350\256\241.md" "b/docs/17-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\217\257\350\247\206\345\214\226\346\225\231\345\255\246\350\256\276\350\256\241.md" new file mode 100644 index 0000000..f1f4ea3 --- /dev/null +++ "b/docs/17-\346\216\222\345\272\217\347\256\227\346\263\225\347\232\204\345\217\257\350\247\206\345\214\226\346\225\231\345\255\246\350\256\276\350\256\241.md" @@ -0,0 +1,35 @@ +# 排序算法的可视化教学设计 + +排序算法之所以适合教学,一个重要原因是它天然具有“过程性”。如果只是给出代码和复杂度,学习者往往难以真正理解;而通过可视化和交互式设计,排序过程中的比较、交换、移动和分治逻辑会变得更直观。 + +#### 为什么排序算法特别适合做可视化教学? + +排序算法的每一步都会改变元素顺序,因此非常容易通过柱状图、卡片、颜色标记和动画轨迹表现出来。学习者可以直接看到“哪些元素被比较了”“哪些元素交换了位置”“哪些区域已经有序”,这比单纯阅读代码更容易建立直觉。 + +#### 可视化排序教学最应该展示哪些信息? + +教学展示时建议至少突出四类信息:(1)当前比较的元素;(2)发生交换或移动的位置;(3)已排序区与未排序区的边界;(4)累计比较次数、交换次数或递归层级等统计信息。对于快速排序和归并排序,还可以额外展示 Pivot、分区边界或分治拆分过程。 + +#### 不同排序算法的可视化重点有什么区别? + +冒泡排序适合突出“相邻比较和最大值上浮”;插入排序适合展示“元素插入到已排序区”的过程;归并排序适合展示“先拆后合”的分治结构;快速排序适合突出 Pivot 和分区;堆排序则应强调堆顶、下沉和堆区间变化。不同算法的教学重点不同,可视化设计也不应完全相同。 + +#### 排序动画为什么不能只追求炫酷效果? + +如果动画太快、颜色过多、元素移动逻辑不清晰,学习者反而更难理解。可视化教学的目标不是“好看”,而是“可解释”。因此动画设计应优先服务于认知过程,例如用有限的颜色表达状态、用暂停节奏突出关键步骤、用文字说明补充复杂阶段。 + +#### 交互式排序教学可以加入哪些功能? + +交互式系统可以加入:步进播放、暂停回看、速度调节、输入自定义数组、切换算法、同步显示伪代码、实时统计比较/交换次数、展示时间复杂度提示等功能。这些设计能帮助学习者把“看懂动画”进一步转化为“理解算法机制”。 + +#### 如何把排序教学和 RAG 问答结合起来? + +在 RAG 增强型教学系统中,可视化不应与问答脱节。理想状态是:学习者一边观看排序过程,一边可以提问“为什么这里交换了?”“为什么快速排序不稳定?”“这一轮结束后谁已经有序?”系统则基于知识库给出针对当前动画步骤的解释,从而形成图文问答联动。 + +#### 设计排序教学内容时应避免哪些常见问题? + +常见问题包括:只演示结果不演示过程、没有标识已排序区和未排序区、所有算法使用完全相同的动画模板、忽略复杂度和稳定性的说明、缺少与代码或伪代码的对应关系。这些问题会让学生“看热闹”,却难以真正掌握算法思想。 + +#### 本章小结与提问建议 + +排序算法的可视化教学设计,关键在于把“过程”变成“可理解的过程”,而不是单纯把数组移动做成动画。学习本章后,可以继续追问:“同一种可视化模板为什么不适合所有排序算法?”以及“RAG 系统如何根据当前步骤解释排序行为?” diff --git "a/docs/18-\346\216\222\345\272\217\347\256\227\346\263\225\345\255\246\344\271\240\350\267\257\345\276\204\344\270\216\347\237\245\350\257\206\345\233\276\350\260\261.md" "b/docs/18-\346\216\222\345\272\217\347\256\227\346\263\225\345\255\246\344\271\240\350\267\257\345\276\204\344\270\216\347\237\245\350\257\206\345\233\276\350\260\261.md" new file mode 100644 index 0000000..535ede6 --- /dev/null +++ "b/docs/18-\346\216\222\345\272\217\347\256\227\346\263\225\345\255\246\344\271\240\350\267\257\345\276\204\344\270\216\347\237\245\350\257\206\345\233\276\350\260\261.md" @@ -0,0 +1,35 @@ +# 排序算法学习路径与知识图谱 + +学习排序算法时,很多人的困难不在于单个算法难,而在于“学完一个又一个,却不知道它们之间是什么关系”。本章的目标就是帮助学习者建立一张排序算法知识图谱,把零散知识串成体系。 + +#### 学习排序算法时为什么需要知识图谱视角? + +如果只按顺序背诵冒泡、选择、插入、快速、归并、堆排序,学习者容易停留在“各学各的”状态。知识图谱视角强调的是关联:哪些算法属于简单排序,哪些体现分治思想,哪些属于非比较排序,哪些更偏工程实践,哪些与 TopK、外部排序、数据库和搜索系统相连。 + +#### 推荐的排序算法学习顺序是什么? + +一个较自然的学习路径是:(1)先学冒泡、选择、插入,建立比较、交换、稳定性和复杂度的基础概念;(2)再学希尔排序,理解对简单排序的优化思路;(3)学习归并排序和快速排序,掌握分治思想;(4)学习堆排序,理解数据结构和排序的结合;(5)学习计数排序、桶排序、基数排序,扩展到非比较排序;(6)再进入 TopK、外部排序、工程实践和应用场景。 + +#### 排序算法知识体系中有哪些核心主线? + +可以从四条主线来理解排序算法:(1)**复杂度主线**:O(n²) 到 O(n log n) 再到特定条件下的 O(n)。(2)**稳定性主线**:哪些算法能保持相等元素顺序,为什么这很重要。(3)**空间主线**:原地排序和非原地排序的取舍。(4)**场景主线**:教学、面试、标准库实现、TopK、数据库、搜索、大数据处理。 + +#### 如何把不同算法联系起来理解? + +可以把插入排序看作简单排序中最具工程价值的代表,把希尔排序看作插入排序的优化延伸;把归并排序和快速排序看作分治思想的两种经典实现;把堆排序看作“数据结构驱动排序”的典型;把计数、桶、基数排序看作“利用数据特征突破比较下界”的方法。这样学习时就不再是孤立记忆。 + +#### 排序算法学习过程中最常见的误区有哪些? + +常见误区包括:只记结论不理解原因、只背复杂度不分析场景、忽视稳定性和原地性的实际意义、把标准库排序误认为单一算法、认为“最快排序”在所有场景都一样。要真正掌握排序,必须把算法特征和使用条件放在一起理解。 + +#### 在教学系统中如何呈现这张知识图谱? + +教学系统可以把排序算法组织成“基础入门”“高效比较排序”“非比较排序”“工程实践”“应用场景”“面试专题”等模块,并通过可视化关系图、学习路线推荐和关联问答来帮助学习者逐步建立全局认识。 + +#### 为什么学习路径设计对 RAG 教学系统很重要? + +因为 RAG 系统不仅要回答单个问题,还要帮助学习者形成连续认知。如果系统知道“用户正在从插入排序过渡到快速排序”,它就能更自然地推荐对比问题、解释相关概念,甚至引导用户进入更合适的下一主题。 + +#### 本章小结与提问建议 + +排序算法学习路径与知识图谱的价值,在于把“会做题”提升到“会组织知识”。学习本章后,可以继续追问:“为什么排序算法应该按主线而不是按文件顺序来理解?”以及“教学系统如何根据学习路径做更智能的问答引导?” diff --git a/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/.openspec.yaml b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/.openspec.yaml new file mode 100644 index 0000000..859e7bb --- /dev/null +++ b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-04-15 diff --git a/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/design.md b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/design.md new file mode 100644 index 0000000..6746934 --- /dev/null +++ b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/design.md @@ -0,0 +1,87 @@ +## Context + +当前仓库的 `docs/` 目录已经包含 12 篇排序算法相关文档,覆盖基础算法、综合对比、工程实践、应用场景和面试问题,但仍存在三个明显问题:一是专题覆盖仍不完整,缺少计数排序、桶排序、TopK、外部排序、教学设计与学习路径等高价值内容;二是现有文档虽然整体为中文问答式写法,但在开篇导语、结尾收束、术语统一和扩展约束上仍不完全一致;三是后续新增文档缺少一份明确的编写规范,难以保证未来继续扩写时保持同一套风格。 + +本次变更的核心对象是 `docs/` 目录中的排序算法教学文档,不涉及运行时代码、接口或数据模型。主要利益相关者包括项目作者、后续维护者、排序算法学习者,以及依赖这些文档进行知识库切片与问答生成的 RAG 流程。 + +约束条件如下: + +- 所有文档必须使用中文命名、中文撰写和 Markdown 格式。 +- 新增内容必须与现有 `docs/01-12` 风格衔接,避免形成两套文档体系。 +- 现有文档以补充和统一为主,不做不必要的大幅重写。 +- 文档应同时兼顾“学生可直接阅读”和“后续适合知识库切片”两种用途。 + +## Goals / Non-Goals + +**Goals:** + +- 建立一套完整的排序算法教学文档整理方案,覆盖现有文档补充与新增专题文档两部分。 +- 明确后续所有排序算法文档的统一结构、命名规则、术语表达和写作语气。 +- 让 `docs/` 目录形成可持续扩展的中文教学资料体系。 +- 为后续实现阶段输出可直接执行的文档任务清单。 + +**Non-Goals:** + +- 不在本次设计中定义 RAG 检索、切片、向量化等运行时实现细节。 +- 不要求本次变更同步修改后端代码、接口或数据库结构。 +- 不要求把所有现有文档重写为完全相同的篇幅或完全一致的章节数。 +- 不扩展到排序算法之外的其他算法主题。 + +## Decisions + +### 决策一:将本次变更拆分为“内容整理”和“风格统一”两个 capability + +将能力拆分为 `sorting-docs-curation` 与 `sorting-doc-style-consistency`,分别承接“补内容”和“建规范”两类目标。这样可以在 specs 与 tasks 阶段清晰区分哪些任务是新增/补充文档,哪些任务是建立长期约束。 + +备选方案是将所有内容都放进单一 capability 中,但这样会让需求边界模糊,不利于后续任务拆分与验收。 + +### 决策二:保留现有 `docs/01-12` 主体内容,以补充和统一为主 + +当前文档整体已经具备较好的中文教学基础,且文件编号和主题划分清晰,因此优先选择“保留现状 + 轻量补充 + 风格统一”的策略,而不是整体推倒重写。这样能减少无效改动,并更快形成可用的文档体系。 + +备选方案是重写整套文档,但这会显著扩大范围,也会增加与现有内容风格脱节的风险。 + +### 决策三:新增专题文档采用与现有文档一致的中文问答式结构 + +新增专题文档继续使用“标题 + 多个问题与回答”的组织方式,并要求在每篇文档中补足开篇导语与结尾总结/教学提问建议。这种结构既适合学生直接阅读,也便于后续做段落级知识切片。 + +备选方案是将新文档改写为目录式或百科式条目,但这会破坏现有文档的一致性。 + +### 决策四:新增独立的文档规范文件作为长期约束 + +在 `docs/` 中新增一份文档编写规范文件,用于固定中文命名、Markdown 格式、结构模板、术语写法和风格要求。后续新增文档默认遵循该规范,避免每次扩写时重新讨论格式。 + +备选方案是仅在 OpenSpec artifacts 中描述规范而不落盘,但这样对后续仓库维护者的可见性较低。 + +### 决策五:新增专题优先覆盖排序教学体系中的高价值缺口 + +新增文档优先覆盖计数排序、桶排序、TopK问题与排序选择、外部排序与海量数据处理、排序算法的可视化教学设计、排序算法学习路径与知识图谱等主题。这些主题既能补足当前知识库缺口,也更能体现“排序算法教学系统”的特色。 + +备选方案是继续扩写基础排序变体,但相较之下,上述专题更能提升整体体系完整性。 + +## Risks / Trade-offs + +- [现有文档补充过少,统一效果不明显] → 在任务阶段明确至少补足开篇导语、结尾收束和关键术语统一三类改动。 +- [现有文档补充过多,造成不必要重写] → 控制策略为“保留主体内容,只做结构与表达上的统一增强”。 +- [新增规范过于抽象,后续执行时难以落地] → 规范中必须包含命名规则、标题层级、推荐结构和术语清单等可执行要求。 +- [新增专题与现有文档内容重复] → 在任务阶段先按主题补缺,避免重复写八大基础排序的常规介绍。 +- [教学阅读性与知识库切片需求冲突] → 统一采用问答式、段落相对独立、术语清晰的写法,同时避免过度碎片化。 + +## Migration Plan + +本次变更仅涉及仓库内文档文件的新增与修改,不涉及部署迁移或运行时回滚。 + +实施顺序建议为: + +1. 新增规格文件,明确两项 capability 的验收要求。 +2. 生成任务清单,区分现有文档补充、专题文档新增、规范文件编写。 +3. 实现阶段先新增文档规范文件,再补齐现有文档,最后新增专题文档。 +4. 完成后统一检查命名、结构、术语和风格一致性。 + +若需要回退,仅需撤销本次文档改动即可,不影响系统运行。 + +## Open Questions + +- 文档规范文件最终采用 `docs/00-文档编写规范.md` 还是 `docs/00-排序算法文档编写规范.md` 命名,在实现时可根据目录可读性确定。 +- 现有文档是否需要额外增加导航页,在实现阶段可结合总览文档一并决定。 +- 新增专题文档的具体编号顺序是否严格固定为 `13-18`,实现时可按最终主题列表确认。 diff --git a/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/proposal.md b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/proposal.md new file mode 100644 index 0000000..a4500b1 --- /dev/null +++ b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/proposal.md @@ -0,0 +1,25 @@ +## Why + +当前项目的 `docs/` 目录已经包含一批排序算法相关文档,但整体仍存在专题覆盖不完整、文档风格不完全统一、后续扩展缺少明确规范的问题。作为“面向排序算法教学的 RAG 增强型交互式系统”,需要将这批资料整理成一套统一的中文教学文档体系,以便直接服务于课程讲解、毕业设计展示与后续知识库入库。 + +## What Changes + +- 对现有 `docs/` 中的排序算法文档进行补充与统一,保持标题、术语、结构、语气和命名风格一致。 +- 新增一组与排序算法教学相关的专题文档,补足当前知识库中非比较排序、工程应用、教学设计、学习路径等内容缺口。 +- 明确所有新增与后续维护的排序算法文档均使用中文命名、中文撰写,并统一采用 Markdown 格式。 +- 新增一份文档编写规范,用于约束后续文档的结构模板、术语表达和风格要求,确保未来继续扩写时保持一致性。 + +## Capabilities + +### New Capabilities +- `sorting-docs-curation`: 建立一套面向排序算法教学的中文文档整理能力,支持对现有文档补充完善并新增高价值专题文档。 +- `sorting-doc-style-consistency`: 建立排序算法文档统一写作规范,约束中文命名、Markdown 格式、问答式结构、术语表达和教学化风格。 + +### Modified Capabilities + +## Impact + +- 主要影响 `docs/` 目录下现有和新增的排序算法文档。 +- 将新增一份面向后续维护的文档规范文件,作为后续扩展的统一依据。 +- 不涉及后端接口、数据库结构或运行时依赖变更。 +- 将为后续在 OpenSpec 中补充 specs、design、tasks 提供明确的范围和目标。 diff --git a/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/specs/sorting-doc-style-consistency/spec.md b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/specs/sorting-doc-style-consistency/spec.md new file mode 100644 index 0000000..6730fe8 --- /dev/null +++ b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/specs/sorting-doc-style-consistency/spec.md @@ -0,0 +1,34 @@ +## ADDED Requirements + +### Requirement: 排序算法文档必须遵循统一命名规范 +系统 MUST 为排序算法教学文档定义统一的命名规范,使现有文档和后续新增文档在文件名、标题和编号方式上保持一致。 + +#### Scenario: 命名新文档 +- **WHEN** 维护者新增排序算法教学文档 +- **THEN** 文档文件名必须采用“编号 + 中文标题”的统一格式 +- **THEN** 文档一级标题必须与文档主题一致,并保持中文表达为主 + +### Requirement: 排序算法文档必须遵循统一结构模板 +系统 MUST 为排序算法教学文档提供统一的推荐结构,使文档在阅读体验和知识组织上保持一致。 + +#### Scenario: 编写新专题文档 +- **WHEN** 维护者新增排序算法专题文档 +- **THEN** 文档必须包含清晰的开篇导语 +- **THEN** 文档主体必须以问题与回答的教学式结构展开 +- **THEN** 文档结尾必须包含总结性内容或适合教学系统延展提问的收束内容 + +### Requirement: 排序算法文档必须统一术语表达 +系统 MUST 统一排序算法文档中的核心术语表达,避免同一概念在不同文档中出现明显不一致的描述。 + +#### Scenario: 统一复杂度与性质术语 +- **WHEN** 维护者补充或新增排序算法文档 +- **THEN** 文档中关于时间复杂度、空间复杂度、稳定性、原地排序、自适应性、比较排序和非比较排序的表述必须保持一致 +- **THEN** 不同文档不得对同一术语使用互相冲突的解释 + +### Requirement: 系统必须提供可持续维护的文档规范文件 +系统 MUST 新增一份面向排序算法教学文档的规范文件,作为后续继续扩展文档时的统一依据。 + +#### Scenario: 后续维护者继续扩写文档 +- **WHEN** 后续维护者需要新增或修改排序算法教学文档 +- **THEN** 仓库中必须存在一份可直接参考的文档编写规范 +- **THEN** 该规范必须覆盖命名规则、结构模板、语言风格和术语表达要求 diff --git a/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/specs/sorting-docs-curation/spec.md b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/specs/sorting-docs-curation/spec.md new file mode 100644 index 0000000..d335e2f --- /dev/null +++ b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/specs/sorting-docs-curation/spec.md @@ -0,0 +1,34 @@ +## ADDED Requirements + +### Requirement: 排序算法教学文档必须使用中文整理 +系统中的排序算法教学文档整理方案 MUST 要求相关文档使用中文命名、中文撰写,并以 Markdown 文件形式存放在 `docs/` 目录中。 + +#### Scenario: 新增排序算法文档 +- **WHEN** 维护者新增与排序算法教学相关的文档 +- **THEN** 文档必须使用中文标题和中文文件名 +- **THEN** 文档必须使用 `.md` 格式 +- **THEN** 文档必须放在 `docs/` 目录下 + +### Requirement: 现有排序算法文档必须进行补充完善 +系统 MUST 对现有排序算法文档进行补充完善,使其在保留原有主体内容的前提下,具备更完整的教学引导和更统一的结构表达。 + +#### Scenario: 补充现有基础文档 +- **WHEN** 维护者整理现有 `docs/01-12` 排序算法文档 +- **THEN** 必须优先采用补充和统一的方式,而不是无必要地整篇重写 +- **THEN** 必须补足影响整体一致性的结构性内容,例如开篇导语、结尾总结或教学提问建议 + +### Requirement: 系统必须新增高价值排序专题文档 +系统 MUST 新增与排序算法教学紧密相关的专题文档,以补足现有知识体系中尚未覆盖或覆盖不足的内容。 + +#### Scenario: 补齐排序专题缺口 +- **WHEN** 维护者执行本次文档整理变更 +- **THEN** 必须新增一组不同于现有八大基础排序介绍的专题文档 +- **THEN** 新增内容必须优先覆盖非比较排序扩展、排序工程实践、教学设计或学习路径等高价值主题 + +### Requirement: 文档体系必须兼顾教学阅读与知识库复用 +系统中的排序算法文档 MUST 同时满足学习者直接阅读和后续知识库切片复用两类用途,因此内容组织必须清晰、段落独立且表述准确。 + +#### Scenario: 文档用于教学与知识库入库 +- **WHEN** 一篇排序算法文档被用于教学阅读或知识库切片 +- **THEN** 文档内容必须能够独立表达核心概念、对比关系或应用场景 +- **THEN** 文档不得依赖大量上下文跳转才能理解主要结论 diff --git a/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/tasks.md b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/tasks.md new file mode 100644 index 0000000..0afa60d --- /dev/null +++ b/openspec/changes/archive/2026-04-15-organize-sorting-algorithm-docs-and-unify-style/tasks.md @@ -0,0 +1,28 @@ +## 1. 文档规范与整体结构 + +- [x] 1.1 新增排序算法文档编写规范文件,明确中文命名、Markdown 格式、推荐结构、术语表达和统一语气要求 +- [x] 1.2 确定本轮新增专题文档的最终文件名与编号顺序,并与现有 `docs/01-12` 保持同一命名体系 +- [x] 1.3 统一梳理现有 `docs/` 的结构约束,明确哪些文档需要补导语、补结尾、补术语统一 + +## 2. 现有文档补充与统一 + +- [x] 2.1 补充 `docs/01-08` 基础排序文档的开篇导语与结尾收束内容,保持教学式结构一致 +- [x] 2.2 补充 `docs/09-12` 综合与专题文档的导语、总结或教学提问建议,统一整体表达风格 +- [x] 2.3 统一现有 `docs/01-12` 中关于时间复杂度、空间复杂度、稳定性、原地排序、自适应性等核心术语的表述 +- [x] 2.4 复查现有文档内容,确保补充后仍以“增强与统一”为主,不对原有主体做无必要重写 + +## 3. 新增排序专题文档 + +- [x] 3.1 新增 `docs/13-计数排序.md`,覆盖原理、适用条件、稳定性、值域限制与典型场景 +- [x] 3.2 新增 `docs/14-桶排序.md`,覆盖分桶思想、性能特征、适用分布与工程限制 +- [x] 3.3 新增 `docs/15-TopK问题与排序选择.md`,覆盖全量排序、堆、快速选择与典型应用 +- [x] 3.4 新增 `docs/16-外部排序与海量数据处理.md`,覆盖 Run 生成、多路归并、最小堆与实际场景 +- [x] 3.5 新增 `docs/17-排序算法的可视化教学设计.md`,覆盖教学表达、动画讲解重点与交互式讲授思路 +- [x] 3.6 新增 `docs/18-排序算法学习路径与知识图谱.md`,覆盖排序算法知识体系、学习顺序与主题关联 + +## 4. 一致性检查与收尾 + +- [x] 4.1 统一检查现有与新增文档的文件名、一级标题、问答结构和结尾样式是否一致 +- [x] 4.2 检查所有本轮文档是否均为中文命名、中文内容和 Markdown 格式 +- [x] 4.3 检查新增与补充内容是否兼顾教学阅读体验和后续知识库切片复用 +- [x] 4.4 最终通读 `docs/` 本轮改动内容,确认整体已形成统一的中文排序算法教学文档体系 diff --git a/openspec/specs/sorting-doc-style-consistency/spec.md b/openspec/specs/sorting-doc-style-consistency/spec.md new file mode 100644 index 0000000..38894b5 --- /dev/null +++ b/openspec/specs/sorting-doc-style-consistency/spec.md @@ -0,0 +1,38 @@ +## Purpose + +定义排序算法教学文档在命名、结构、术语和写作风格上的统一规范,确保现有文档与后续新增文档保持一致。 + +## Requirements + +### Requirement: 排序算法文档必须遵循统一命名规范 +系统 MUST 为排序算法教学文档定义统一的命名规范,使现有文档和后续新增文档在文件名、标题和编号方式上保持一致。 + +#### Scenario: 命名新文档 +- **WHEN** 维护者新增排序算法教学文档 +- **THEN** 文档文件名必须采用“编号 + 中文标题”的统一格式 +- **THEN** 文档一级标题必须与文档主题一致,并保持中文表达为主 + +### Requirement: 排序算法文档必须遵循统一结构模板 +系统 MUST 为排序算法教学文档提供统一的推荐结构,使文档在阅读体验和知识组织上保持一致。 + +#### Scenario: 编写新专题文档 +- **WHEN** 维护者新增排序算法专题文档 +- **THEN** 文档必须包含清晰的开篇导语 +- **THEN** 文档主体必须以问题与回答的教学式结构展开 +- **THEN** 文档结尾必须包含总结性内容或适合教学系统延展提问的收束内容 + +### Requirement: 排序算法文档必须统一术语表达 +系统 MUST 统一排序算法文档中的核心术语表达,避免同一概念在不同文档中出现明显不一致的描述。 + +#### Scenario: 统一复杂度与性质术语 +- **WHEN** 维护者补充或新增排序算法文档 +- **THEN** 文档中关于时间复杂度、空间复杂度、稳定性、原地排序、自适应性、比较排序和非比较排序的表述必须保持一致 +- **THEN** 不同文档不得对同一术语使用互相冲突的解释 + +### Requirement: 系统必须提供可持续维护的文档规范文件 +系统 MUST 新增一份面向排序算法教学文档的规范文件,作为后续继续扩展文档时的统一依据。 + +#### Scenario: 后续维护者继续扩写文档 +- **WHEN** 后续维护者需要新增或修改排序算法教学文档 +- **THEN** 仓库中必须存在一份可直接参考的文档编写规范 +- **THEN** 该规范必须覆盖命名规则、结构模板、语言风格和术语表达要求 diff --git a/openspec/specs/sorting-docs-curation/spec.md b/openspec/specs/sorting-docs-curation/spec.md new file mode 100644 index 0000000..f95406a --- /dev/null +++ b/openspec/specs/sorting-docs-curation/spec.md @@ -0,0 +1,38 @@ +## Purpose + +定义排序算法教学文档的整理范围与质量要求,确保文档内容使用中文编写、覆盖关键专题,并兼顾教学阅读和知识库复用。 + +## Requirements + +### Requirement: 排序算法教学文档必须使用中文整理 +系统中的排序算法教学文档整理方案 MUST 要求相关文档使用中文命名、中文撰写,并以 Markdown 文件形式存放在 `docs/` 目录中。 + +#### Scenario: 新增排序算法文档 +- **WHEN** 维护者新增与排序算法教学相关的文档 +- **THEN** 文档必须使用中文标题和中文文件名 +- **THEN** 文档必须使用 `.md` 格式 +- **THEN** 文档必须放在 `docs/` 目录下 + +### Requirement: 现有排序算法文档必须进行补充完善 +系统 MUST 对现有排序算法文档进行补充完善,使其在保留原有主体内容的前提下,具备更完整的教学引导和更统一的结构表达。 + +#### Scenario: 补充现有基础文档 +- **WHEN** 维护者整理现有 `docs/01-12` 排序算法文档 +- **THEN** 必须优先采用补充和统一的方式,而不是无必要地整篇重写 +- **THEN** 必须补足影响整体一致性的结构性内容,例如开篇导语、结尾总结或教学提问建议 + +### Requirement: 系统必须新增高价值排序专题文档 +系统 MUST 新增与排序算法教学紧密相关的专题文档,以补足现有知识体系中尚未覆盖或覆盖不足的内容。 + +#### Scenario: 补齐排序专题缺口 +- **WHEN** 维护者执行本次文档整理变更 +- **THEN** 必须新增一组不同于现有八大基础排序介绍的专题文档 +- **THEN** 新增内容必须优先覆盖非比较排序扩展、排序工程实践、教学设计或学习路径等高价值主题 + +### Requirement: 文档体系必须兼顾教学阅读与知识库复用 +系统中的排序算法文档 MUST 同时满足学习者直接阅读和后续知识库切片复用两类用途,因此内容组织必须清晰、段落独立且表述准确。 + +#### Scenario: 文档用于教学与知识库入库 +- **WHEN** 一篇排序算法文档被用于教学阅读或知识库切片 +- **THEN** 文档内容必须能够独立表达核心概念、对比关系或应用场景 +- **THEN** 文档不得依赖大量上下文跳转才能理解主要结论