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的记录写至输出归并段 }
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的记录写至输出归并段 */ }
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; }
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的记录写至输出归并段 }