//STL提供的是Max heap,使用vector作为底部容器
//push_heap算法:首先将元素放到堆所对应的数组的末端,然后从该节点开始向上调整,
//若当前结点键值比父结点大,则兑换位置,如此一直上溯,直到不需对换或直到根节点为止
template <class RandomAccessIterator>
inline void push_heap(RandomAccessIterator first, RandomAccessIterator last)
{
//该函数被调用时,新元素已置于底部容器的最末端
_push_heap_aux(firsst, last, distance_type(first), value_type(first));
} template <class RandomAccessIterator ,class Distance,class T>
inline void _push_heap_aux(RandomAccessIterator first, RandomAccessIterator last, Distance*, T*)
{
_push_heap(first, Distance((last - first) - ), Distance(), T(*(last - )));
} template <class RandomAccessIterator, class Distance, class T>
//first是根节点的迭代器,holeIndex是当前结点下标,topIndex是根节点下标,value是要调整的元素的值
void _push_heap(RandomAccessIterator first, Distance holeIndex, Distance topIndex, T value)
{
Distance parent = (holeIndex - );//父节点下标
while (holeIndex > topIndex&&*(first + parent) < value)
{
*(first + holeIndex) = *(first + parent);
holeIndex = parent;
parent = (holeIndex - ) / ;
}
*(first + holeIndex) = value;
} //pop_heap算法:将最下层最右边的叶节点(即底层容器中最末端元素)替换根节点,然后向下调整
//pop_heap后,最大元素只是被置放于底部容器的最尾端,尚未被取走
template <class RandomAccessIterator ,class Distance,class T>
//holeIndex初始化为0,是根节点的位置,本算法先一直向下调整到叶节点,然后可能需要向上调整
//实际上没必要,只需要当当前结点比左右孩子结点的值都大时就可以停止调整了
void _adjust_heap(RandomAccessIterator first, Distance holeIndex, Distance len, T value)
{
Distance topIndex = holeIndex;
Distance secondChild = * holeIndex + ;//右子结点
while (secondChild < len)
{
if (*(first + secondChild) < *(first + secondChild - ))
secondChild--;
*(first + holeIndex) = *(first = secondChild);
holeIndex = secondChild;
secondChild = * (secondChild + );
}
if (secondChild == len)//没有右子结点,只有左子结点
{
*(first + holeIndex) = *(first + secondChild - );
holeIndex = secondChild - ;
}
_push_heap(first, holeIndex, topIndex, value);
} //sort_heap算法:连续调用pop_heap即可
//排序之后,原来的heap就不再符合heap的特征了
template <class RandomAccessIterator>
void sort_heap(RandomAccessIterator first, RandomAccessIterator last)
{
while (last - first > )
pop_heap(first, last--);
} //make_heap算法:从最后一个非叶节点开始,每个非叶节点都向下调整
template <class RandomAccessIterator,class T,class Distance>
void _make_heap(RandomAccessIterator first, RandomAccessIterator last, T*, Distance*)
{
if (last - first < )
return;
Distance len = last - first;
Distance parent = (len - ) / ; while (ture)
{
_adjust_heap(first, parent, len, T(*(first + parent)));
if (parent == )
return;
parent--;
}
}

heap实现的更多相关文章

  1. java head space/ java.lang.OutOfMemoryError: Java heap space内存溢出

    上一篇JMX/JConsole调试本地还可以在centos6.5 服务器上进行监控有个问题端口只开放22那么设置的9998端口 你怎么都连不上怎么监控?(如果大神知道还望指点,个人见解) 线上项目出现 ...

  2. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  3. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  4. Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap

    摘要 : NetExt中有两个比较常用的命令可以用来分析heap上面的对象. 一个是!wheap, 另外一个是!windex. !wheap 这个命令可以用于打印出heap structure信息. ...

  5. JAVA Shallow heap & Retained heap

    最近在研究内存泄漏的问题,在使用MAT工具中发现了Shallow heap & Retained heap,不懂. 然后在网上找了一些资料. Shallow Size 对象自身占用的内存大小, ...

  6. 笔记:程序内存管理 .bss .data .rodata .text stack heap

    1.未初始化的全局变量(.bss段) bss段用来存放 没有被初始化 和 已经被初始化为0 的全局变量.如下例代码: #include<stdio.h> int bss_array[102 ...

  7. STL heap usage

    简介 heap有查找时间复杂度O(1),查找.插入.删除时间复杂度为O(logN)的特性,STL中heap相关的操作如下: make_heap() push_heap() pop_heap() sor ...

  8. Nodemanager Out of heap memory[fix bug全过程]

    问题: 自己写了一个yarn上的application,发现nodemanager过段时间,会out of memory退出,把nodemanager的heap memory从1G增大到2G也是无法避 ...

  9. Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32

    今天使用Git在命令行下更新代码遇到了问题,起初觉得是自己安装某软件导致冲突,从网上搜索了一下找到类似问题,成功解决问题. 错误信息如下: E:\storm-sql>git pull origi ...

  10. Insert or Merge && Insertion or Heap Sort

    原题连接:https://pta.patest.cn/pta/test/1342/exam/4/question/27102 题目如下: According to Wikipedia: Inserti ...

随机推荐

  1. C#基础 函数部分

    函数:能够独立完成某项功能的模块. 函数四要素:输入.输出.函数体.函数名 函数定义: (static/public) 返回类型 函数名(参数类型 参数名,参数类型 参数名){ 函数体} 函数的调用: ...

  2. protobuf的lua版

    推荐个protobuf的lua版     以前项目客户端lua,通信协议是protobuf,用网易的proto-gen-lua,使用过程遇到些问题需要绕,比如: 1.每次更改.增加proto都要生成新 ...

  3. Python基础:基本数据类型

    python基本标准6类数据类型:Number数字, String字符串, List列表,Tuple元组,Set集合,Dictionary字典 不可变数据3个(Number数字,String字符串,T ...

  4. Linux学习笔记之Linux命令

    1. blkid  查看当前系统中所有已挂载文件系统的类型

  5. js文件中引用其他js文件

    这一个功能的作用是做自己的js包时,可以通过引入一个整体的js文件而引入其他js. 只需要在总体的js加上这一句话 document.write("<script type='text ...

  6. logging,numpy,pandas,matplotlib模块

    logging模块 日志总共分为以下五个级别,这五个级别自下而上进行匹配debug->info->warning->error->critical,默认的最低级别warning ...

  7. 第二章 设计高质量的React组件

    第二章 设计高质量的React组件 高质量React组件的原则和方法: 划分组件边界的原则: React组件的数据种类: React组件的生命周期. 2.1 易于维护组件的设计要素 1.高内聚:指的是 ...

  8. UVA - 12661 Funny Car Racing (Dijkstra算法)

    题目: 思路: 把时间当做距离利用Dijkstra算法来做这个题. 前提:该结点e.c<=e.a,k = d[v]%(e.a+e.b); 当车在这个点的1处时,如果在第一个a这段时间内能够通过且 ...

  9. 解决idea控制台打印乱码问题

    idea控制台打印乱码,用起来总别扭,也是在网上搜索了一番,靠一点猜测解决了. 首先打开你自己的idea的安装目录下(即右键桌面图标,点击打开文件所在位置),然后找到idea.exe.vmoption ...

  10. java一维数组的声明、初始化及排序

    public class TestArray { public static void main(String[] args) { /** 数组声明及动态初始化 int a[] = new int[a ...