#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. Selenium_WebDriver操作iFrame日历框和复选框_Java

    iFrame日历框 页面上遇到iFrame元素时,先用findElement找到这个iFrame元素,然后再WebDriver.switchTo().frame(calFrame).在iFrame里操 ...

  2. TaoCode-淘宝的SVN开源托管平台

    无意中发现的..试用了一下,感觉还不错, 简单说一下怎样使用: 进入 http://code.taobao.org/project/explore/ 注冊完后依据提示新建项目,然后在本地随便新建一个文 ...

  3. POJ 2374 线段树建图+Dijkstra

    题意: 思路: 线段树+Dijkstra(要堆优化的) 线段树要支持打标记 一个栅栏 拆成两个点 :左和右 新加一个栅栏的时候 看看左端点有没有被覆盖过 如果有的话 就分别从覆盖的那条线段的左右向当前 ...

  4. 如何在canvas中画出一个太极图

    先放一个效果图: 代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /&g ...

  5. JavaScript翻译成Java

    这两天公司有一个需求,将一段加密的JavaScript代码转换为JAVA版. JavaScript中的某一段代码: 前期查看了整个JavaScript代码,发现代码中,方法里面嵌套方法,各种不合规的变 ...

  6. mount---挂载文件系统

    挂载概念 Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”. 注意:“挂载点” ...

  7. Input/output subsystem having an integrated advanced programmable interrupt controller for use in a personal computer

    A computer system is described having one or more host processors, a host chipset and an input/outpu ...

  8. [Javascript] Identify the most important words in a document using tf-idf in Natural

    Tf-idf, or term frequency-inverse document frequency, is a statistic that indicates how important a ...

  9. ip地址个数的计算

    一个IP地址,却关联太多的知识 二进制与 8 比特 电脑中显示出来的数字是 10 进制的,键盘的每一个键都由一个 8 位的二进制编码,所以 1 字节等于 8 比特.对数字而言,1 的二进制是 0000 ...

  10. softInputMode- 软件盘的设置

    今天遇到一个问题,就是软件盘弹出来以后,会把之前的布局界面整个的挤到屏幕的外面,而且按下返回建以后,这个软件盘占据的空间会留下一个黑色的背景.在网上查找了很多的方法,刚开始都是说,如下方法 <a ...