学习一下stl_heap

下面的算法是根据stl源码重新整合一下,是为了方便理解

因为使用的迭代器,为了在给定的迭代器之间使用heap的一些方法,

内部通常用disHole来确定某个节点 dishole 是指与first距离,可取0 1 2 3 4.....

inline void push_heap(int heap[], int first, int last)
{
//disHole 指 当前结点 到first的距离 因此距离 是从 0 1 2 3 .....
int disHole = (last - first) - ;
int disHoleParent = (disHole - ) / ;
int value = heap[first+disHole];
while (disHole> && heap[first + disHoleParent] < value)
{
heap[first+disHole] = heap[first+disHoleParent];
disHole = disHoleParent;
disHoleParent = (disHole - ) / ;
}
heap[first + disHole] = value;
} //调用此方法时 实际上将 最顶 元素 放到了最后
//从上往下调整
inline void pop_heap(int heap[], int first, int last)
{
int value = heap[last - ];
heap[last - ] = heap[first];
int disHole = first-first; int disSecondHoleChild = (disHole * + );
while (disSecondHoleChild < (last - first - ))
{
if (heap[first + disSecondHoleChild] < heap[first + disSecondHoleChild - ])
disSecondHoleChild--;
heap[first+disHole] = heap[first+disSecondHoleChild];
disHole = disSecondHoleChild;
disSecondHoleChild = (disHole * + );
}
if (disSecondHoleChild == (last - first - ))
{
heap[first + disHole] = heap[first + disSecondHoleChild - ];
disHole = disSecondHoleChild - ;
} heap[first+disHole] = value;
//这一步,因为在while 循环中,并没有设置让当前大于子女节点时退时
//所以插入后,使用push_head 进行向上调整
//当然暂时不理解stl在设计时 为何在while中不进行判断 break
push_heap(heap, first, disHole + );
}
//利用pop_heap 原理实现 排序
inline void sort_heap(int heap[],int first,int last)
{
while((last-first)>)
{
pop_heap(heap, first, last--);
}
}
//make_heap 将其调整为最大堆
inline void make_heap(int heap[],int first,int last)
{
if ((last - first) < )return;
int dislen = last - first - ;
int disParent = (dislen - ) / ;
while(true)
{
push_heap(heap, first, first + disParent + );
if(disParent==)return;
disParent--;
}
}

stl_heap的更多相关文章

  1. 《STL源代码分析》---stl_heap.h读书笔记

    Heap堆的数据结构是经常使用,Heap它还能够存储元件的.但STL并且不提供Heap集装箱.仅仅提供信息Heap算术运算.只支持RandomAccessIterator该容器可以被用作Heap集装箱 ...

  2. STL 源代码分析 算法 stl_heap.h

    本文senlie原版的.转载请保留此地址:http://blog.csdn.net/zhengsenlie heap ----------------------------------------- ...

  3. stl_heap.h

    stl_heap.h // Filename: stl_heap.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ...

  4. C++ STL源代码学习(map,set内部heap篇)

    stl_heap.h ///STL中使用的是大顶堆 /// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap ...

  5. STL源代码分析——STL算法sort排序算法

    前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ...

  6. stl源码剖析 详细学习笔记 算法总览

    //****************************基本算法***************************** /* stl算法总览,不在stl标准规格的sgi专属算法,都以 *加以标 ...

  7. (转)c++一些知识点

    异常详解: https://www.cnblogs.com/hdk1993/p/4357541.html#top 模版详解: https://blog.csdn.net/lezardfu/articl ...

  8. STL源代码剖析——STL算法stl_algo.h

    前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法.本文剖析STL其它的算法,比如排序算法.合并算法.查找算法等等.在剖析的时候.会针对函数给出一些样例说明函数的使用.源代码出自SG ...

  9. 论C++STL源代码中关于堆算法的那些事

    关于堆,我们肯定熟知的就是它排序的时间复杂度在几个排序算法里面算是比較靠上的O(nlogn)常常会拿来和高速排序和归并排序讨论,并且它还有个长处是它的空间复杂度为O(1), 可是STL中没有给我们提供 ...

随机推荐

  1. 震惊!慎老师怒吃pks并大呼:一口就吃完了!

    慎老师吃pks是怎么回事呢?慎老师相信大家都很熟悉,但是慎老师吃pks是怎么回事呢,下面就让小编带大家一起了解吧. 慎老师吃pks,其实就是慎老师把花花蛤吃了,大家可能会很惊讶慎老师怎么会吃花花蛤呢? ...

  2. LintCode笔记 - 8. 旋转字符串

    这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 旋转字符串 中文English 给定一个字符 ...

  3. 外部应用复制 表格 到word中 设置表格自适应

    word 批量设置表格宽度自适应 描述 : 我们经常从 外部 如 excel,html 等其他文件 中复制的表格到word 文档 经常会出现在 word 中显示不全的问题 主要是源格式的表格 宽度比 ...

  4. CTFHub_技能树_SQL注入Ⅱ

    SQL注入 MySQL结构 进行尝试: 尝试查看表名: 尝试查看列名: 发现无法直接输出: 使用时间注入脚本跑出结果: import requests import time session = re ...

  5. 数据可视化之DAX篇(十七)Power BI表格总计行错误的终极解决方案

    https://zhuanlan.zhihu.com/p/68183990 我在知识星球收到的问题中,关于表格和矩阵(以下统称表格)总计行错误算是常见的问题之一了,不少初学者甚为不解,在Excel透视 ...

  6. 【Nginx】如何封禁IP和IP段?看完这篇我会了!!

    写在前面 Nginx不仅仅只是一款反向代理和负载均衡服务器,它还能提供很多强大的功能,例如:限流.缓存.黑白名单和灰度发布等等.在之前的文章中,我们已经介绍了Nginx提供的这些功能.小伙伴们可以到[ ...

  7. vue中使用elmentUI的Upload组件提交文件和后台接收

    1.参考此博客,希望有以下知识储备 vue的路由,跨域请求,springboot2.X,html,已经阅读elementUI官网中关于upload组件的详细介绍. 2.废话不多说,直接讲解细节. 前台 ...

  8. JVM详解之:java class文件的密码本

    目录 简介 一个简单的class ClassFile的二进制文件 class文件的密码本 magic version 常量池 描述符 access_flags this_class和super_cla ...

  9. sql多表语句

    多条件查询条件判空 最优写法 3三表带条件查询

  10. 转:Oracle 数据泵详解

    一.EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2 ...