用败者树从N个数中选择最大的k个数字

来源:互联网 发布:花都金蝶软件代理 编辑:程序博客网 时间:2024/05/16 12:01
 

20   21   24   29   36   45   56   69   84   101   120   141   164   189   16   45   76   109   144   181   20   61   104   149   196   45   96   149   4   61   120   181   44   109   176   45   116   189   64   141   20   101   184   69   156   45   136   29   124   21   120   21   124   29   136   45   156   69   184   101   20   141   64   189   116   45   176   109   44   181   120   61   4   149   96   45   196   149   104   61   20   181   144   109   76   45   16   189   164   141   120   101   84   69   56   45   36   29   24   21  

 

184  184  189  189  189  189  196  196

¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

#include  <stdio.h>
#include <stdlib.h>

typedef  struct  wrap_data
{
        int  path;
        int  *data;
}wrap_data;


int choosevec(int path)
{
        if(path<=4)
        {
                return 4;
        }
        else if (path<=8)
        {
                return 8;
        }
        else if(path<=16)
        {
                return  16;
        }
        else
        {
                return 32;
        }
}

wrap_data **vec;
int  vecsize;

void    up ( int num )
{
        int  i,j,k;
        wrap_data  *first,*second;
        i=num;
        second=vec[i];
        while(i)
        {
                j=i/2;
                first=vec[j];

                if(!first)
                {
                        vec[j]=second;
                        return ;

                }
                if ( first->path==second->path)
                {
                        i=j;
                }
                else if ( *( second->data  )>  *( first->data  ))
                {
                        vec[j]=second;
                        second=first;
                        i=j;

                }
                else
                {
                        i=j;
                }
        }
}

int  main()
{
#define  PATH  8
#define  LENGTH  100
#define   MAX_BIG   999999999

        wrap_data *result;
        int i=0,j=0,k=0;
        int  global[LENGTH]={0};
        wrap_data a[PATH]={0};
        int  label=0;

        vecsize=2*    choosevec(PATH);
        vec=(wrap_data **)calloc( vecsize ,sizeof (wrap_data*));

        for(i=0;i<LENGTH;i++)
        {
          global[i]=(i*i+20)%200;
                printf("%d   ",global[i]);
        }

        for(i=0;i<PATH;i++)
        {
                a[i].path=i;
                a[i].data=(int *)calloc (1  ,sizeof (int ));
                *(a[i].data)=global[label++];

        }

        k=vecsize/2;
        for(i=0;i<PATH;i++)
        {
                vec[k+i]=&a[i];
        }
        for(i=0;i<PATH;i++)
        {
                up(i+k);

        }


        while(label <LENGTH)
        {
                result=vec[0];
                if( global[label]<*( result->data))
                {
                }
                else
                {
                        vec[0]=0;
                        *(result->data)=global[label ];
                        up (result->path+k);
                }
                label++;

        }
        //dump
        printf("\n");
        i=0;
        while(i++<PATH)
        {
                result=vec[0];
                printf("%d  ", *(result->data));
                vec[0]=0;
                *(result->data)=MAX_BIG;
                up  (result->path+k);

        }

}

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 金毛眼屎多白色怎么办 金毛眼红有眼屎怎么办 狗狗眼睛上火了怎么办 狗上火了眼屎多怎么办 金毛走路扭腰怎么办 金毛流鼻涕微黄怎么办 狗狗下眼皮红了怎么办 金毛眼睛打肿了怎么办 金毛的眼睛红怎么办 眼睛干涩有红血丝怎么办 小孩子眼睛红有眼屎怎么办 狗狗的肉垫粗糙怎么办 狗狗眼睛变蓝色怎么办 脸被太阳晒伤了怎么办 皮肤晒伤红肿痒怎么办 3岁儿童频繁眨眼怎么办 狗狗的眼睛红肿怎么办 脸过敏发红怎么办不痒 上眼皮红肿痒是怎么办 眼睛痒了几天了怎么办 眼睛肿了还痒怎么办 孩子脸上有红血丝怎么办 脸上长了红血丝怎么办 指甲受创出血了怎么办 手指被挤压紫了怎么办 眼睛撞了有淤血怎么办 下眼底有小白点怎么办 狗的白眼球充血怎么办 眼球有出血点是怎么办 吃阿胶上火了该怎么办 胎儿胼胝体发育不良怎么办 鸡眼看到硬芯了怎么办 小脚趾起茧子疼怎么办 脚起老茧很痛怎么办 化疗后骨髓抑制严重怎么办 胃炎引起的胃胀怎么办 胃病胀肚子很鼓怎么办 小孩淋巴结发炎肚子疼痛怎么办 顺产后子宫脱垂怎么办 顺产完子宫脱垂怎么办 额头长了个鱼鳞怎么办