多路平衡归并带来的问题
在上节讨论过,归并趟数S=⌈logmr⌉,增加归并路数m可以减少归并趟数S,进而减少访问外存的次数(I/O次数)。然而,增加归并路数m时,内部归并的时间将增加。做内部归并时,在m个元素中选择关键字最小的记录需要比较m-1次。每趟归并n个元素需要做(n-1)(m-1)次比较,S趟归并总共需要的比较次数为
S(n-1)(m-1)=⌈logmr⌉(n-1)(m-1)=⌈logmr⌉(n-1)(m-1)/⌈log2m⌉
式中,⌈logmr⌉(n-1)在初始归并段个数r与记录个数n定时是常数,而(m-1)/⌈log2m⌉随m增长而增长,因此内部归并时间亦随m的增长而增长。这将抵消由于增大m而减少外存访问次数所得到的效益。因此,不能使用普通的内部归并排序算法。
什么是败者树
为了使内部归并不受m的增大的影响,引入了败者树。败者树是树形选择排序的一种变体,可视为一棵完全二叉树。每个叶结点存放各归并段在归并过程中当前参加比较的记录,内部结点用来记忆左右子树中的“失败者”,而让胜者往上继续进行比较,一直到根结点。若比较两个数