一、问题的提出
1.待排序的记录数量很大,不能一次装入内存,则无法利用前几节讨论的排序方法(否则将引起频繁访问内存);
2.对外存中数据的读/写是以“数据块”为单位进行的;
读/写外存中一个“数据块”的数据所需要的时间为:
TI/O = tseek + tla + n·twm
其中
tseek 为寻查时间(查找该数据块所在磁道)
tla 为等待(延迟)时间
n·twm 为传输数据块中n个记录的时间
二、外部排序的基本过程
由相对独立的两个步骤组成:1.按可用内存大小,利用内部排序的方法,构造若干(记录的)有序子序列,通常
称外存中这些记录有序子序列为“归并段”;
2.通过“归并”,逐步扩大(记录的)有序子序列的长度,直至外存中整个记录序
列按关键字有序为止。
例如:假设有一个含10,000个记录的磁盘文件,而当前所用的计算机一次只能对1,000个记录进行内部排序,则首先利用内部排序的方法得到10个初始归并段, 然后进行逐趟归并。
假设进行2? 路归并(即两两归并),则
第一趟由10个归并段得到5个归并段;
第二趟由 5 个归并段得到3个归并段;
第三趟由 3 个归并段得到2个归并段;
最后一趟归并得到整个记录的有序序列。
分析上述外排过程中访问外存(对外存进行读/写)的次数:
假设“数据块”的大小为200,即每一次访问外存可以读/写200个记录。
则对于10,000个记录,处理一遍需访问外存100次(读和写各50次)。
由此,对上述例子而言,
1. 求得10个初始归并段需访问外存100次;
2. 每进行一趟归并需访问外存100次;
3. 总计访问外存 100 + 4*100 = 500次。
外排总的时间还应包括内部排序所需时间和逐趟归并时进行内部归并的时间,显然,除去内部排序的因素外,外部排序的时间取决于逐趟归并所需进行的“趟数”。
例如,若对上述例子采用5? 路归并,则只需进行2趟归并,总的访问外存的次数将
压缩到 100+ 2*100 = 300 次
一般情况下,假设待排记录序列含m个初始归并段,外排时采用k? 路归并,则归并
趟数为 ,显然,随之k的增大归并的趟数将减少,因此对外排而言,通常
采用多路归并。k的大小可选,但需综合考虑各种因素。
实现
结合前两篇博文实现。