• 多路归并排序之败者树


    #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");
    }
  • 相关阅读:
    美丽的前端控件
    LeetCode:Rotate List
    VC++ 改动VMware BIOS、uuid_location、ethernet0_address等
    我们错过了那么多机会,怎么办
    怎样在centos安装python-mysql?
    eMMC ext4综述【转】
    闪存中的NorFlash、NandFlash及eMMC三者的区别【转】
    UFS和EMMC的区别--原理学习【转】
    EMMC 介绍【转】
    emmc和ssd的区别【转】
  • 原文地址:https://www.cnblogs.com/dyc0113/p/4600548.html
Copyright © 2020-2023  润新知