采用多路归并技术可以减少归并次数,从而降低块读/写次数,加速排序速度。但一般路数的多少取决于内存的容量。此外,多路归并排序的快慢还取决于内部归并算法的快慢。
设文件有n个记录,m个初始归并段,采用k路归并方法。k路归并的基本操作是,从k个归并段的第一个记录中选出最小记录,把他从输入缓冲区移入输出缓冲区。常见的方法是基于败者树的多路替代选择归并排序方法。
在败者树中,每个叶节点存放各个归并段在归并过程中当前参加比较的记录,每个非叶节点表示的是其左、右子女节点中的败者,即在双亲节点记录下比赛中的败者,让胜者去参加更高一层的比赛。因此,败者树的根节点记录的是败者,还需要加一个节点来记录整个过程的胜者,以下图(源自百度)所示的败者树为例,实现5路归并排序。
在上图的败者树中,b3和b4比赛,b3胜b4负,节点ls[4]的值为4,即败者b4的下标;b1和b2比赛,b1胜b2负,节点ls[1]的值为1。因为在败者树中根节点ls[1]里存储的是败者,所以用节点ls[0]来记录比赛中的胜者,即b3。
在选出最小关键码之后,只要修改b3的值即可,将b3的值改为同一归并段中的下一个记录的关键码,然后对该节点向上的双亲节点所指的关键码进行比较,败者留在双亲节点,胜者继续向上,直至成为根节点的双亲。