C++胜者树
#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++胜者树的更多相关文章
- winner tree 胜者树
在树形选择排序中,利用锦标赛思想建立的树称为胜者树. 1.每个非终端节点存储的是左右孩子节点中的优胜者. 2.通过减少比较次数,提高效率. 3.胜者树就是一颗特殊的线段树. 一.构建树 Procedu ...
- 外排序 & 败者树 & 多路归并-学习
来来来,根据这篇文章,学一下败者树吧: http://blog.csdn.net/whz_zb/article/details/7425152 一.胜者树 胜者树的一个优点是,如果一个选手的值改变了, ...
- 大数据组件原理总结-Hadoop、Hbase、Kafka、Zookeeper、Spark
Hadoop原理 分为HDFS与Yarn两个部分.HDFS有Namenode和Datanode两个部分.每个节点占用一个电脑.Datanode定时向Namenode发送心跳包,心跳包中包含Datano ...
- RMQ (Range Minimal Query) 问题 ,稀疏表 ST
RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...
- poj 题目分类(2)
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj329 ...
- ACM常用算法及练习(1)
ACM常用算法及练习 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短 ...
- 十种JAVA排序算法实例
一.冒泡(Bubble)排序 复制代码 代码如下: void BubbleSortArray() { for(int i=1;i<n;i++) { for ...
- how to learn algorithms(ZAC)
(这一篇觉得写得很棒,故拷过来以便慢慢看,细细体会,详情请访问http://blog.csdn.net/shenmen123456/article/details/6575647) 第一阶段:练经典常 ...
- ACM学习
转:ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. US ...
随机推荐
- 1.6 INSERT语句
1.6 INSERT语句正在更新内容,请稍后
- POJ 1328 Radar Installation 贪心题解
本题是贪心法题解.只是须要自己观察出规律.这就不easy了,非常easy出错. 一般网上做法是找区间的方法. 这里给出一个独特的方法: 1 依照x轴大小排序 2 从最左边的点循环.首先找到最小x轴的圆 ...
- js---10时间类
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 第一个WPF
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- windows 常见环境变量(%AppData%、%TEMP%、%TMP%)
set 命令查看全部环境变量: %AppData%(应用程序数据).%TEMP%(临时文件夹).%TMP%(临时文件夹) .%LocalAppData%(应用程序本地数据)三个环境变量: C:\Use ...
- 68.connect-flash 用法详解 req,flash()
转自:http://yunkus.com/connect-flash-usage/ connect-flash 用法详解 前端工具 2016-10-05 2016-10-05 朝夕熊 11 ...
- pgrep---以名称为依据从运行进程队列中查找进程
pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id.每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行.对于每个属性选项,用户可以 ...
- dp之多重背包(未用二进制优化)
hdu 2191: #include <iostream>#include <stdio.h>#include <string.h>using namespace ...
- C# XML类学习整理(待补)
一.读取xml文件内容: #region "获取xml文件内容" //将xml文件加载进来 XDocument xdoc = XDocument.Load("F:\\6. ...
- HDFS简单介绍及用C语言訪问HDFS接口操作实践
一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广 ...