多路归并排序之败者树

#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");
}

 

转载于:https://www.cnblogs.com/dyc0113/p/4600548.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值