k路归并,则每得到有序串的下一个元素,若按传统的归并方法,则需要(k-1)次比较(找到k个元素中的最小值),然而若采用败者树的方法,每得到有序串的下一个元素仅需次比较。
败者树的主要特点有:1、败者树有k个叶子节点,每个叶子节点分别存放需要归并的k个归并串的当前值。需要一个辅助的节点来存放关键字可能的最小值,这个辅助节点是在初始化败者树的时候用到。
归并排序_败者树算法的可描述为:1、初始化(得到初始化败者树)并得到k个值中的胜者。2、取下胜者加入有序输出结果,并改变胜者对应归并串的当前值。3、调整(从上一个胜者对应的归并串开始走到树根即可)得到新的败者树.....2、3循环......直到得到的胜者是关键字的最大值(为了防止某个归并段变空,可以在每个归并段中附加一个关键字为最大值的记录,当选出的“冠军”记录的关键字为最大值时,表明此次递归完成)。
败者树的初始化也容易实现,只要先令所有的非终端节点指向一个含最小关键字的辅助节点(最后一个叶子节点的下一个节点),然后从各个叶子节点出发调整非终端节点为新的败者即可。并且初始化完成后得到第一个最小值(胜者)。
关于5路归并败者树,一个C语言的实现如下:
#include<stdio.h>
#include<limits.h>
typedef int losertree[5];//所有非叶子节点结构,k路归并就是k个元素的数组,每个元素代表一个非叶子节点
typedef struct
{
}external[6];