#include <iostream>
#define MAX_VALUE 0x7fffffff
using namespace std;
//在这里我先反思一下。不知道怎么搞的,这个算法耗费我3个小时,慘不忍睹。 void DealWhat(int b[],int n,int flags)//每一次在n位置调整该位置的与子树的大小关系。
{
int left = 2 * n + 1;
int right = 2 * n + 2;
if (left > flags)//左右子树都不是内部节点。
{
if (b[left] > b[right])
b[n] = right;
else b[n] = left;
}
else if (left == flags && right > flags)//左子树是内部节点。右子树不是。
{
if (b[b[left]] > b[right])
b[n] = right;
else
b[n] = b[left];
}
else//是全然内部结点。
{
if (b[b[left]] > b[b[right]])
b[n] = b[right];
else b[n] = b[left];
}
}
void Grial(int a[],int n)
{
int size = 2 * n - 1;
int *b = new int[size];
int k = size-1;
int i = n - 1;
while (i>=0)
{
b[k--] = a[i];
i--;
}
i = size / 2-1;
int flags = i;//标记值。用来推断节点是不是全然内部节点,就是该节点的子节点不是叶子节点。
while (i>=0)
{
DealWhat(b, i, flags);//初始化构造胜者树。
i--;
}
int *save = new int[n];//vs2013以下不能改动a[i]的值,我试着将a数组直接保存求得
k = 0; //的数字,但是总是报错,惆怅了半天。 i = 1;
while (k < n)
{
save[k++] = b[b[0]];
b[b[0]] = MAX_VALUE;//每次取走该位置的这个值后,将该位置的值设为无穷大。
i = (b[0] -1) /2 ;
while (i >= 0)
{ DealWhat(b, i, flags);
if (i == 0)break;
i = (i - 1)/2;//此处每次操作完成之后朝父亲节点移动。 }
}
for (i = 0; i < n; i++)
{
cout << save[i] << " ";
}
cout << endl;
delete[]b;
b = nullptr;//vs2013里面的NULL=nullptr。 }
int main()
{
int a[] = {2,3,4,1,7,6,0,22,-1,33,5};
Grial(a, 11);
return 0;
}

胜者树相似于冒泡排序的优化,记录已经比較的,去掉不必比較的,

将最小的不停冒泡选出。终于得到结果。跟堆十分相似。

C++胜者树的更多相关文章

  1. winner tree 胜者树

    在树形选择排序中,利用锦标赛思想建立的树称为胜者树. 1.每个非终端节点存储的是左右孩子节点中的优胜者. 2.通过减少比较次数,提高效率. 3.胜者树就是一颗特殊的线段树. 一.构建树 Procedu ...

  2. 外排序 & 败者树 & 多路归并-学习

    来来来,根据这篇文章,学一下败者树吧: http://blog.csdn.net/whz_zb/article/details/7425152 一.胜者树 胜者树的一个优点是,如果一个选手的值改变了, ...

  3. 大数据组件原理总结-Hadoop、Hbase、Kafka、Zookeeper、Spark

    Hadoop原理 分为HDFS与Yarn两个部分.HDFS有Namenode和Datanode两个部分.每个节点占用一个电脑.Datanode定时向Namenode发送心跳包,心跳包中包含Datano ...

  4. RMQ (Range Minimal Query) 问题 ,稀疏表 ST

    RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...

  5. poj 题目分类(2)

    初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj329 ...

  6. ACM常用算法及练习(1)

    ACM常用算法及练习 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短 ...

  7. 十种JAVA排序算法实例

    一.冒泡(Bubble)排序 复制代码 代码如下: void BubbleSortArray() {       for(int i=1;i<n;i++)       {         for ...

  8. how to learn algorithms(ZAC)

    (这一篇觉得写得很棒,故拷过来以便慢慢看,细细体会,详情请访问http://blog.csdn.net/shenmen123456/article/details/6575647) 第一阶段:练经典常 ...

  9. ACM学习

    转:ACM大量习题题库   ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库.   US ...

随机推荐

  1. LintCode 二叉树的遍历 (非递归)

    前序: class Solution { public: /** * @param root: The root of binary tree. * @return: Preorder in vect ...

  2. 【LeetCode-面试算法经典-Java实现】【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】

    [121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Say you have ...

  3. #学习记录#——CSS content 属性

    CSS content 属性常结合:before 和:after 这两个伪类一起使用,给指定的元素添加内容来丰富页面. 1. 添加文本内容 html: <h1>给末尾添加内容. </ ...

  4. Gym 100952 A. Who is the winner?

    A. Who is the winner? time limit per test 1 second memory limit per test 64 megabytes input standard ...

  5. hello world! hello cnbog

    第一次开通博客,以后见证我的成长吧!

  6. js简易留言板

      <!DOCTYPE html>   <html lang="en">   <head>   <meta charset="U ...

  7. centos7 docker镜像源设置

    由于docker他的镜像下载地址是国外官网源需要修改 添加 Docker 加速镜像(阿里云专属) 安装/升级你的Docker客户端 推荐安装1.10.0以上版本的Docker客户端,参考文档 dock ...

  8. dig---域名查询

    dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. QUESTION SECTION 这部分是提问,显示你要查询的域名 ANSWER SECTION 即答案,显示查询到的域名对应的IP ...

  9. asp.net core系列 39 Razor 介绍与详细示例

    原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...

  10. 微信小程序从零开始开发步骤(一)搭建开发环境

    从零到有写一个小程序系列专题,很早以前就想写来分享,但由于项目一直在进展,没有过多的时间研究技术,现在可以继续分享了. 1:注册 用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,网址: ...