7.7外部排序
原来学过的所有排序算法,都是建立再计算机内存中进行。由于内存的大小限制,前面的所学的排序的算法都是针对数据量不也是特别大的情况,。所有的这些排序都属于内部排序。
但是有很多时候,需要对大文件进行排序,因为文件中记录很多、信息量庞大,无法将整个文件拷贝进内存中进行排序、因为文件中的记录很多、信息量庞大,无法将整个文件拷贝进内存中进行排序。
解决办法:需要将待排序的记录存储在外存上,排序时再把数据一部分一部分的调入内存进行排序后的我结果仍然被放到原有文件中。这种排序的方法就叫做外部排序。
一开始的有序归并段如何得到?
1)比较差的操作:
分批的将数据调入内存中进行排序得到一些归并段在调出内存。(这样的I/O操作所耗费时间比较多)
初始归并段如果太短,会增加外存写进写出的次数,增大时间开销。内存大小有限,我们需要的归并段长度可能比内存空间还大.
2)置换-选择排序
内存中的数比有序归并段中最大的数还大:第一个有序归并段形成
此时内存中和剩余序列都没有数据,多以输出第二个归并段。
有序归并段得到后怎末确定再次归并顺序?
不同的归并段会得到不同的,意味着需要进行的I/O操作次数不同。因为需要找到一种归并次数最少的归并策略来减少I/O操作次数。(最佳归并树)。
最佳归并树:
缺点:最佳归并策略可以通过最佳归并树来找到,但是对于多路归并来说,每次归并如何得到最值得关键字,当归并得路数很大时,如果每次都是通过比较进行排序那么带来较大得开销。(败者树)
败者树:败者树可以看成是一颗完全二叉树:
这棵树的叶子结点存储的各个归并段当前参加比较的记录,内部结点存储的则是左右子树中的失败者,胜利树则一直继续向上比较直到根结点。
由于每次归并我们都是希望找到各个归并段中的最小关键字,所以胜利者应该是左右子树中的关键字的较小值。