败者树是树形选择排序的一种变型,它的每个非终端结点表示左右孩子中的败者,至于为什么要使用败者树,而不是胜者树,这个问题我在网上也没有寻找到答案,可能在建立树的调整树的时候败者树更加符合外部排序的要求吧,
注:建立败者树的过程,,这个最好用图画出来比较好理解,
#include<iostream>
using namespace std;
#define k 5
typedef int Losertree[k];
struct exnode{
int key;
};
typedef exnode External[k+1];//存放带归并段的关键字,
void Adjust(Losertree &ls,int s,External &b){
int t=(s+k)/2; //t为 b[s]的双亲结点,这个可以画图理解
while(t>0){
if(b[s].key>b[ls[t]].key){//s指向新的胜者,而ls[t]指向败者
int tem=s;
s=ls[t];
ls[t]=tem;
}
t/=2;//向上继续比较
}
ls[0]=s;//记录下最后的胜者
}
void Create_losertree(Losertree &ls,External &b){
for(int i=0;i!=k;++i){//设置ls败者的初值都为k, k位置的关键字已经设置为了-1,
ls[i]=k;
}
for(int i=0;i!=k;++i){//一次从存储点第一个关键词开始进行调整
Adjust(ls,i,b);
}
}
v