http://hi.baidu.com/wenborao/blog/item/6c628b1733b70a0ac83d6d15.html
利用败者树k路数平衡归并
#define K 8 /*已经有序的归并路数*/
#define MINKEY -1 /*比所有关键字都小的一个值*/
#define MAXKEY 10000 /*比所有关键字都大的一个值*/
void Adjust(int ls[K] ,int s)
/*从叶子节点b【s】到根节点的父节点ls【0】调整败者树*/
{ int t,temp;
t=(s+K)/2; /*t为b【s】的父节点在败者树中的下标,K是归并段的个数*/
while(t>0) /*若没有到达树根,则继续*/
{ if(b[s]>b[ls[t]]) /*与父节点指示的数据进行比较*/
{
/*ls【t】记录败者所在的段号,s指示新的胜者,胜者将去参加更上一层的比较*/
temp=s;
s=ls[t];
ls[t]=temp;
}
t=t/2; /*向树根退一层*/
}
ls[0]=s; /*ls[0]记录本趟最小关键字所在的段号*/
}
void K_merge( int ls[K])
/*ls【0】~ls【k-1】是败者树的内部节点。b【0】~b【k-1】分别存蓄k个初始归并段的当前记录*/
/*函数Get_next(i)用于从第i个归并段读取并返回当前记录*/
{ int b[K+1),i,q;
for(i=0; i<K;i++)
{ b[i]=Get_next(i); /*分别读取K个归并段的第一个关键字*/
}
b[K]=MINKEY; /*创建败者树*/
for(i=0; i<K ; i++) /*设置ls中的败者初值*/
ls[i]=K;
for(i=K-1 ; i>=0 ; i--) /*依次从b【K-1】……b【0】出发调整败者*/
Adjust(ls , i);
while(b[ls[0]] !=MAXKEY )
{ q=ls[0]; /*q为当前最小关键字所在的归并段*/
prinftf("%d",b[q]);
b[q]=Get_next(q);
Adjust(ls,q); /*q为调整败者树后,选择新的最小关键字*/
}
}
本文介绍了一种利用败者树实现的K路数平衡归并算法。该算法通过构建败者树来高效地从多个已排序的序列中找到最小元素,并完成最终的归并操作。文中详细解释了败者树的构建过程及其调整算法。

1159

被折叠的 条评论
为什么被折叠?



