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为调整败者树后,选择新的最小关键字*/
}
}