#include<iostream>
#include<iomanip>
#define M 4
using namespace std;
class LoserTree
{
private:
// 调整K为2的整数次幂
int round(int k)
{
if(k&(k-1)!=0)
{
int i=0;
for(i=31;i>=0;i--)
{
if(((1<<i)&k)!=0)
{
cout<<i<<endl;
break;
}
}
return 0x1<<(i+1);
}
return k;
}
void ajust(int s)
{
cout<<"调整:"<<s<<endl;
int sData=_ls[s];
int t=s/2;
while(t>=1)
{
if(_data[_ls[t]]<_data[sData])
{
int tmp=sData;
sData=_ls[t];
_ls[t]=tmp;
}
t=t/2;
}
_ls[0]=sData;
}
const int _k;
int _n; // 败者树应留下多少空间存放根节点
int *_data; // 存放数据
int *_ls; // 存放败者树的结构
public:
const int MINKEY;
const int MAXKEY;
void print(int *ls,int n)
{
cout<<"|||||||||||||||"<<endl;
for(int i=0;i<n;i++)
cout<<setw(5)<<i;
cout<<endl;
for(int i=0;i<n;i++)
{
cout<<setw(5)<<ls[i];
}
cout<<endl;
}
int init(int input[],int m) // 初始化败者树,并返回胜者的下标
{
if(m!=_k)
{
return -1;
}
int i;
for(i=0;i<_n+1;i++)
{
_ls[i]=_k; // 映射到最小值
}
for(i=0;i<_k;i++)
{
_data[i]=input[i];
}
for(i=_n+1;i<_n+_k+1;i++)
{
_ls[i]=i-(_n+1);
}
for(i=_n+_k;i>=_n+1;i--)
{
ajust(i);
print(_ls,_n+_k+1);
}
return _ls[0];
}
int next(int index,int value)
{
_data[index]=value;
ajust(index);
return _ls[0];
}
LoserTree(int k):_k(k),MINKEY(1<<31),MAXKEY(~(1<<31))
{
_n=round(_k)-1; // 计算前面应当预留多少空间
_data=new int[_k+1];
_ls=new int [_n+_k+1];
_ls[_k]=MINKEY;
}
~LoserTree()
{
delete []_data;
delete []_ls;
}
};
int main()
{
int input[M],i;
for(i=0;i<M;i++)
{
input[i]=rand()%20;
cout<<input[i]<<" ";
}
cout<<endl;
LoserTree lt(M);
int index=lt.init(input,M); // 初始化败者树,并放入到数据缓冲器,此时会返回一个胜者的下标,根据下标可以调用next函数输入下一个数据
cout<<"min index:"<<index<<"min:"<<input[index]<<endl;
system("pause");
}