多路归并排序之败者树
#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"); }