本章要回答的三个问题:把一堆乱序数据变有序,为什么"交换简单的招式"与"分治的招式"效率差出数量级?比较排序是不是快到头了、突破又靠什么?数据一旦有序,查找能便宜到什么程度?
排序是计算机科学的"国民课题":数据库的索引、推荐的召回、去重与合并、报表输出,背后全是排序。它也是最好的复杂度教具——同一目标,冒泡、插入、快排、堆排、计数排序给出从平方级到线性级的完整谱系,每一步差距都能用操作计数说清。查找则是排序的孪生兄弟:无序只能扫,有序可以砍半,二分查找用"每次排除一半"把查找压到对数级,是全书性价比最高的一招。两兄弟合起来还有一个隐藏主题:预处理换查询——排一次序,此后每次查找都沾光,这笔账怎么算,本章会给出公式化的答案。
本章按"功力进阶"排布:入门三式(冒泡、选择、插入)胜在简单与稳定,练手也练分析;分治双雄(快排、归并)与堆排序代表比较排序的主流战力;非比较排序(计数、基数)绕开比较下界,在特定数据分布下打出线性;最后收束到查找——线性扫与二分砍半的对照,以及二分思想的变形。
排序还是"稳定与否、原地与否"这两个工程维度的最佳教材:同样能排好序的算法,在多关键字排序、内存受限场景下的高下立判。本章每节都会把这两栏标出来,读完你应当能按"数据规模、是否近有序、内存预算、稳定性要求"四问给真实需求开出排序处方。
对照开头的问题,本章的知识点清单如下:
| 节 | 回答哪个问题 | 关键产出 |
|---|---|---|
| 5.1 入门三式 | 简单排序值不值得练 | 三式实现与计数对照、稳定性判读 |
| 5.2 分治双雄 | 主流排序为何快 | 快排分区跟踪、最坏复现、归并合并 |
| 5.3 堆排与线性排序 | 比较的下界与突破 | 堆排序、计数排序、下界直觉 |
| 5.4 线性与二分 | 有序之后查找多便宜 | 二分不变量、边界变体、二分答案 |
排序与查找是前面所有结构的一次大阅兵:数组是战场、递归是骨架、堆是引擎。本章出口直通两处:第六章的分治法与动态规划大量复用本章的"分而治之、预处理换查询"心法;第七章字符串匹配则把"查找"推进到模式串层面。工程上,语言内置排序(TimSort、pdqsort)正是本章各招式的工业化混编,读完你能看懂它们为什么那样设计。检验掌握程度的方式带着纸笔做:任选一章的排序,对同一组八个数写出每趟结束后的数组状态——写得出中间态,才是真会,只背得出复杂度不算。