对应章节:排序 → 外部排序
1. 什么是外部排序
当待排序数据太大,无法一次性全部放进内存时,就要使用外部排序。
核心流程:
大文件
↓
分块读入内存
↓
每块内部排序
↓
形成多个有序的初始归并段
↓
多路归并
↓
得到最终有序文件
2. 生成初始归并段
假设内存一次能装下 L 个记录:
读入 L 个记录
↓
在内存中排序
↓
写回外存
↓
形成一个有序归并段
重复后得到:
r 个初始归并段
3. 什么是 k 路归并
k 路归并:
一次同时合并 k 个有序归并段。
内存中通常需要:
k 个输入缓冲区
+
1 个输出缓冲区
4. k 路归并怎么做
1. 从 k 个归并段各读一块到输入缓冲区
2. 比较 k 个当前候选记录
3. 选最小记录放入输出缓冲区
4. 某输入缓冲区用完,就继续读对应归并段
5. 输出缓冲区写满,就写回外存
6. 重复直到合并完成
5. 需要多少趟归并
初始有 r 个归并段,每次做 k 路归并:
S = ceil(log_k r)
大白话:
每做一趟
归并段数量大约缩小为原来的 1/k
例如:
r=16,k=4
16 → 4 → 1
所以:
S=2
6. 速记
外部排序:
先分块排好
再多路合并
k路归并:
k个输入缓冲区
1个输出缓冲区
归并趟数:
S = ceil(log_k r)