利用败者树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          {     b[i]=Get_next(i);           /*分别读取K个归并段的第一个关键字*/
   }
     b[K]=MINKEY;                        /*创建败者树*/
     for(i=0; i            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为调整败者树后,选择新的最小关键字*/
          }
}

你可能感兴趣的:(Alogrithm)