一.基本概念
这里的外存特指磁盘,磁盘存储数据的存储单元以磁盘块为单位,操作系统也以“块”为单位对磁盘存储空间进行管理。

一个绿色部分为一块,共16块

每个磁盘块都可以存放数据,如果想要修改磁盘中的数据,需要将对应的磁盘块读入内存。
每个磁盘块中包含三个记录。

首先要在内存开辟一片与“块”大小一致的缓冲区,然后可将其读入内存。磁盘的读写都是以块为单位进行的。

因此想要修改磁盘中的数据,需要读入磁盘、修改、再写会外存。
二.外部排序

使用归并排序,最少需要在内容分配3块缓冲区,即可对任意文件进行排序。
接下来用归并排序的方式对记录递增排序
1.将前两块内容读入内存

对数据进行内部排序,使缓冲区1到2为递增次序

逐个放入输出缓冲区,输出到外存


现在第一个磁盘块和第二个磁盘块记录变为递增有序,这两块成为一个“归并段”,归并段内部是递增有序的。

对剩余磁盘块两两一组进行处理,得到8个归并段

至此完成了初始归并段的构造,进行了16次读和16次写
2.对初始归并段进行归并排序

将归并段1和归并段2中更小的块放入内存

按内部排序的二路归并,选出三个最小元素放入输出缓冲区

将其写回外存

继续25加入,26加入输出缓冲区,此时输入缓冲区1为空,将归并段1的下一个磁盘块写入

27加入,写会外存,输出缓冲区2空,归并段2的下一个磁盘块替补

凑够3个写回,再凑3个,写回。至此完成了2个归并段的归并

对其他的归并段两两一组进行归并,得到4个新的归并段

3.第二趟归并
两个一组,将每个归并段的第一个磁盘块写入内存,同样方法对比和写回。当输入缓冲区i为空时及时用归并段i的下一个磁盘块填补


完成,得到2个新的归并段

3.第三趟归并,实现整体有序

三.时间开销

外部排序的时间开销=读写外存时间(与读写磁盘次数成正比)+内部排序时间(构造初始归并段)+内部归并时间(第i趟归并)
其中读写磁盘次数=初始块数×2(读/写)+初始块数×2×归并趟数。上例中读写磁盘次数=32+32×3
四.优化
1.为提高效率,可以通过增加输入缓冲区个数,进行多路归并,即增加归并路数,来减少归并趟数
如通过四路归并,一次排好4个归并段

生成2个新的归并段

第一趟结束,第二趟将这两个归并段二路归并即可,只需要2趟即可完成
若树高为h,可以看成归并趟数为h-1

设初始有r个归并段,在树的第h层,有 r ≤
2
h
−
1
2^{h-1}
2h−1,即
(
h
−
1
)
m
i
n
{(h-1)}_{min}
(h−1)min= ⌈
l
o
g
2
r
log_2r
log2r⌉,因此对于k路归并形成的k叉树,
(
h
−
1
)
m
i
n
{(h-1)}_{min}
(h−1)min= ⌈
l
o
g
k
r
log_kr
logkr⌉=归并趟数的最小值
k越大,r越小时 归并趟数越小,读写磁盘次数减少,效率高
缺点:
①k路归并需要开辟k个输入缓冲区,内存开销较大
②每挑选一个关键字需要对比关键字k-1次,内部排序所需时间增加
因此k不是越大越好
2.增加初始归并段的长度,来减少归并段个数
直接读入四块内容,再写回外存

构造初始归并段只有4个

五.多路平衡归并
①最多只能有k个段归并为一个
②每一趟归并中,若有m个归并段参与归并,则经过一趟处理得到⌈m/k⌉个新的归并段