利用败者树k路数平衡归并

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值