数据结构 第 8 章 名词库
每条最多四行:是/不是/易混/范围。
建设进度:✅ 8.1 排序概念 ✅ 8.2 插入排序 ✅ 8.3 交换排序 ✅ 8.4 选择排序 ✅ 8.5 归并/基数/计数 ✅ 8.6 比较与应用 ✅ 8.7 外部排序 (全章完整)
8.1 排序的基本概念
排序
- 是:重新排列表中的元素,使表中的元素满足按关键字有序的过程。
- 范围:输出是输入序列的一个重排,使
。
稳定性
- 是:关键字相同的两个元素,排序前后相对次序不变。
- 不是:不能用来衡量算法优劣,只是对算法性质的描述。
- 范围:关键字不允许重复时,稳定与否无关紧要;证明不稳定只需举一组反例。
内部排序 / 外部排序
- 是:按元素是否完全存放在内存中划分。
- 范围:内部排序的两种基本操作是比较和移动;基数排序不基于比较。
- 易混:不是按数据量大小划分。
8.2 插入排序
直接插入排序
- 是:把待排记录按关键字插入前面已排好序的子序列。
- 范围:最好
、平均/最坏 、空间 、稳定、顺序和链式都适用。
折半插入排序
- 是:用折半查找定位插入位置,然后统一后移。
- 不是:总时间复杂度不是
,仍是 。 - 范围:只减少比较次数(约
且与初始状态无关);移动次数未变;稳定;仅适用于顺序存储。
希尔排序
- 是:也称缩小增量排序,按增量分组做直接插入排序,直到
。 - 不是:教材不给具体的时间复杂度——「依赖于增量函数,无法准确给出」。
- 范围:空间
、不稳定、仅顺序存储;尚未求得一个最好的增量序列。
8.3 交换排序
冒泡排序
- 是:两两比较相邻元素,逆序则交换;每趟确定一个元素的最终位置。
- 范围:最好
(带提前结束判断)、平均/最坏 、空间 、稳定、顺序+链式。
快速排序
- 是:基于分治,一次划分把枢轴放到最终位置。
- 范围:最好/平均
、最坏 (序列已有序时)、空间 (递归工作栈,最坏 )、不稳定、仅顺序存储。 - 易混:空间不是
; 的是堆排序。
教材版 Partition
- 是:
pivot=K[j](区间最后一个)、填坑而非 swap、先i向右再j向左、<=前进>=后退。 - 范围:「一趟划分后的序列」答案唯一,必须照这一版走;算竞的对撞交换法会得到不同的中间序列。
8.4 选择排序
简单选择排序
- 是:第
趟从 中选最小的与 交换。 - 不是:最好情况也不是
。 - 范围:比较次数恒为
,与初始状态无关,时间始终 ;移动不超过 次;不稳定(反例 );顺序和链式都适用。
堆
- 是:
且 (大根堆), 。 - 范围:可视为完全二叉树;大根堆的最大元素在根,任意非根结点的值小于或等于其双亲结点值。
- 易混:不同分支的结点之间没有大小关系。
建堆
- 是:从
往前,逐个对以该结点为根的子树筛选。 - 范围:大根堆调整时与左右孩子中较大者交换;交换后可能连锁下沉,要一路调到底;建堆是线性时间
。
堆排序
- 是:建堆 → 输出堆顶 → 堆底元素送堆顶 → 向下调整 → 重复。
- 范围:最好/平均/最坏都是
;空间 (三个 算法里最省);不稳定;仅顺序存储。
堆的应用
- 是:只有两个——堆排序和优先队列(大纲新增考点,教材明确限定)。
8.5 归并、基数、计数
二路归并排序
- 是:把
个长度为 1 的有序表两两归并,直至合成一个长度为 的有序表。 - 范围:分割子序列与初始序列的排列无关,所以最好/最坏/平均都是
;空间 ;稳定;顺序+链式;归并趟数 。 - 易混:平均时间复杂度为
的稳定排序算法只有它一个。
基数排序
- 是:不基于比较和移动,基于关键字各位的大小,通过分配和收集实现。
- 范围:
(三种情况相同);空间 (与 无关);稳定(且稳定是 LSD 正确性的前提);顺序+链式。
计数排序
- 是:统计比每个元素小的元素个数,直接定位。
- 范围:教材标
*8.5.3,选学;比较写成if(a[i]<=a[j]) count[j]++;才稳定,少一个等号就不稳定。
8.6 比较与应用
表 8.1
- 范围:希尔排序的三个时间格子是空的(依赖增量函数);空间那一列仅列举平均情况(快排最坏
未写在表里)。
稳定的四个 / 不稳定的四个
- 是:稳定 = 插入、冒泡、归并、基数;不稳定 = 简单选择、快速、希尔、堆。
- 范围:教材建议从算法原理上理解,而不应拘泥于死记硬背。
仅顺序存储的四个
- 是:折半插入、希尔、快速、堆排序。
- 范围:共同原因是都需要随机存取;其余五个(直接插入、冒泡、简单选择、归并、基数)顺序和链式都适用。
过程特征
- 是:冒泡、简单选择、堆排序每趟产生当前最大或最小值;快速排序一趟至少确定一个元素的最终位置。
- 范围:这是「给中间序列问算法」这类题的判据。
排序算法小结
- 是:
小用直接插入或简单选择(记录信息量大时用简单选择,移动少); 大用快排/堆/归并(要稳定选归并);初始基本有序选直接插入或冒泡。 - 范围:「快排最好」的限定语是**「关键字随机分布时、基于比较的内部排序算法中」**。
8.7 外部排序
外部排序
- 是:待排文件无法一次装入内存,需要在内存和外存之间多次交换数据的排序。
- 范围:时间代价主要考虑 I/O 次数;教材明说不会在算法设计上进行考查。
归并段(顺串)
- 是:第一阶段由内部排序产生的有序子文件。
- 范围:个数记为
,长度记为 , 。
归并趟数
- 是:
, 为归并路数。 - 范围:总 I/O 次数
, 为磁盘块数;末尾那个 是内部排序阶段的读/写,最容易漏。
多路平衡归并
- 是:每趟把
个(或不足 个)有序段归并为一个。 - 范围:增大
减少趟数,但内部比较随 增长;且缓冲区变小会使交换次数增大,所以 不是越大越好。
败者树
- 是:树形选择排序的一种变体,可视为完全二叉树;
个叶结点存各段当前元素,内部结点记忆左右子树中的「失败者」。 - 不是:根
ls[0]存的是冠军的段号,不是败者。 - 范围:深度
;选一次最小仅需 次比较;初始构造需 次比较;使用后内部归并的比较次数与 无关。
置换-选择排序
- 是:用工作区 WA 反复选 MINIMAX 记录输出,产生长度超过 WA 容量的初始归并段。
- 范围:MINIMAX 是**「比上一个输出值大的记录中的最小者」;选不出新 MINIMAX 时当前归并段结束;教材说选 MINIMAX 的过程需利用败者树实现**。
最佳归并树
- 是:把哈夫曼树推广到
叉,让记录数少的归并段最先归并,使总 I/O 最少。 - 范围:I/O 次数
;WPL 内部结点权值。
虚段
- 是:初始归并段不足以构成严格(正则)
叉树时补入的、长度为 0 的段。 - 范围:
; 时补 个;权为 0 的叶子应离树根最远。 - 易混:「缺额的归并段留在最后做低路归并」不是最佳方案(教材例中 386 > 326)。
高频范围限定清单
| 常见说法 | 范围限定 |
|---|---|
| 「稳定的算法更好」 | 错。稳定性不衡量优劣 |
| 「关键字不重复时也要考虑稳定性」 | 错。无关紧要 |
| 「所有内部排序都基于比较」 | 错。基数排序不基于比较 |
| 「折半插入排序总时间 | 错。只是比较次数;总时间仍 |
| 「折半插入的比较次数与初始状态有关」 | 错。无关,仅取决于 |
| 「折半插入可用于链表」 | 错。仅顺序存储 |
| 「直接插入只能用于顺序表」 | 错。顺序和链式都行 |
| 「希尔排序时间是 | 教材不给具体值,表里是空格 |
| 「冒泡最好 | 错。带提前结束判断时是 |
| 「简单选择最好 | 错。比较次数恒为 |
| 「快排空间 | 错。 |
| 「快排最坏 | 错。 |
| 「快排对有序序列最快」 | 错。此时划分最不平衡 |
| 「枢轴随便取,中间序列一样」 | 错。教材版枢轴是区间最后一个、用填坑法 |
| 「一趟快排所有元素到位」 | 错。至少一个(枢轴)到位 |
| 「建堆从 | 错。从 |
| 「建堆时间 | 错。线性时间 |
| 「大根堆与左孩子交换」 | 错。与左右孩子中较大者 |
| 「一次交换即完成调整」 | 错。可能连锁下沉 |
| 「堆排序空间 | 错。 |
| 「堆的应用有很多」 | 错。只有堆排序和优先队列 |
| 「归并最坏 | 错。三种情况都是 |
| 「归并空间 | 错。 |
| 「 | 错。只有归并排序 |
| 「基数排序空间 | 错。 |
| 「基数排序可以不稳定」 | 错。稳定是 LSD 正确性的前提 |
| 「基数排序受 | 错。它不基于比较 |
| 「计数排序天然稳定」 | 错。取决于比较时有没有等号 |
| 「堆排序空间比快排大」 | 错。堆 |
| 「初始基本有序用快排」 | 错。用直接插入或冒泡 |
| 「 | 错。记录信息量大时用简单选择 |
| 「外部排序会考算法设计」 | 错。教材明说不会 |
| 「归并趟数 | 错。 |
| 「总 I/O | 错。还要加内部排序阶段的 |
| 「增大 | 错。 |
| 「败者树内部结点存胜者」 | 错。存败者;ls[0] 存冠军 |
| 「初始建败者树需 | 错。 |
| 「败者树深度 | 错。 |
| 「二路归并只要两个缓冲区」 | 错。三个:两输入一输出 |
| 「MINIMAX 是 WA 中最小值」 | 只在段首成立;段中是「比上一个输出值大的最小者」 |
| 「I/O 次数 = WPL」 | 错。 |
| 「虚段可放在任意位置」 | 错。权为 0 的叶子应离根最远 |
| 「缺额留最后做低路归并即可」 | 错。不是最佳方案 |
链接
- 🏠 返回总览:数据结构第 8 章:排序总览
- 📕 附录入口:数据结构附录