Пример #1
0
 void K_Merge(LoserTree ls,External b)
 { // 利用败者树ls将编号从0到k-1的k个输入归并段中的记录归并到输出归并段。
   // b[0]至b[k-1]为败者树上的k个叶子结点,分别存放k个输入归并段中当前
   // 记录的关键字。算法11.1
   int i,q;
   for(i=0;i<k;++i) // 分别从k个输入归并段读人该段当前第一个记录的关键字到外结点
     input(i,b[i].key);
   CreateLoserTree(ls); // 建败者树ls,选得最小关键字为b[ls[0]].key
   while(b[ls[0]].key!=MAXKEY)
   {
     q=ls[0]; // q指示当前最小关键字所在归并段
     output(q); // 将编号为q的归并段中当前(关键字为b[q].key)的记录写至输出归并段
     input(q,b[q].key); // 从编号为q的输入归并段中读人下一个记录的关键字
     Adjust(ls,q); // 调整败者树,选择新的最小关键字
   }
   output(ls[0]); // 将含最大关键字MAXKEY的记录写至输出归并段
 }
Пример #2
0
 void K_Merge(LoserTree ls,External b)
 { /* 利用败者树ls将编号从0到k-1的k个输入归并段中的记录归并到输出归并段。 */
   /* b[0]至b[k-1]为败者树上的k个叶子结点,分别存放k个输入归并段中当前 */
   /* 记录的关键字。算法11.1 */
   int i,q;
   for(i=0;i<k;++i) /* 分别从k个输入归并段读人该段当前第一个记录的关键字到外结点 */
     input(i,&b[i].key);
   CreateLoserTree(ls); /* 建败者树ls,选得最小关键字为b[ls[0]].key */
   while(b[ls[0]].key!=MAXKEY)
   {
     q=ls[0]; /* q指示当前最小关键字所在归并段 */
     output(q); /* 将编号为q的归并段中当前(关键字为b[q].key)的记录写至输出归并段 */
     input(q,&b[q].key); /* 从编号为q的输入归并段中读人下一个记录的关键字 */
     Adjust(ls,q); /* 调整败者树,选择新的最小关键字 */
   }
   output(ls[0]); /* 将含最大关键字MAXKEY的记录写至输出归并段 */
 }
Пример #3
0
int main()
{
    int i;
    memset(pa, 0, N *sizeof(int));
    for (i = 0; i < N; ++i) {
        leaf[i] = data[i][pa[i]];
	pa[i]++;
    }
    leaf[N] = MAXMIN;
    CreateLoserTree();
    while (leaf[losernode[0]] != MAXMAX) {
        printf("%d ", leaf[losernode[0]]);
	int i   = losernode[0];
	leaf[i] = data[i][pa[i]++];
	Modify(i);
    }
    return 0;
}
Пример #4
0
void K_Merge( LoserTree *ls , External *b )
{ //利用败者树ls将编号从0到k-1的k个输入归并段中的记录归并到输出归并段
 //b[0]至b[k-1]为败者树上的k个叶子结点,分别存放k个输入归并段中当前记录的关键字
 int i ;
 KeyType q ;

 for( i = 0 ; i < k ; ++ i )
  Input( b , i ) ;      //分别从k个输入归并段读入当前第一个记录的关键字到外结点

 CreateLoserTree( ls , b ) ;     //建败者树ls,选最小关键字b[ls[0]].key
 while( (*b)[ (*ls)[0] ].key != MAXKEY )
 {
  q = (*ls)[ 0 ] ;      //q指示当前最小关键字所在归并段
  Output( *b , q ) ;      //将编号为q的归并段中当前(关键字b[q]->key)的记录写至输出归并段

  Input( b , q ) ;      //从编号为q的输入归并段中读入下一个记录的关键字
  Adjust( ls , q , b ) ;     //调整败者树,选择新的最小关键字
 }
// Output( *b , (*ls)[ 0 ] ) ;      //将含最大关键MAXKEY的记录写至输出归并段
}