stl_heap
学习一下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的更多相关文章
- 《STL源代码分析》---stl_heap.h读书笔记
Heap堆的数据结构是经常使用,Heap它还能够存储元件的.但STL并且不提供Heap集装箱.仅仅提供信息Heap算术运算.只支持RandomAccessIterator该容器可以被用作Heap集装箱 ...
- STL 源代码分析 算法 stl_heap.h
本文senlie原版的.转载请保留此地址:http://blog.csdn.net/zhengsenlie heap ----------------------------------------- ...
- stl_heap.h
stl_heap.h // Filename: stl_heap.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ...
- C++ STL源代码学习(map,set内部heap篇)
stl_heap.h ///STL中使用的是大顶堆 /// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap ...
- STL源代码分析——STL算法sort排序算法
前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ...
- stl源码剖析 详细学习笔记 算法总览
//****************************基本算法***************************** /* stl算法总览,不在stl标准规格的sgi专属算法,都以 *加以标 ...
- (转)c++一些知识点
异常详解: https://www.cnblogs.com/hdk1993/p/4357541.html#top 模版详解: https://blog.csdn.net/lezardfu/articl ...
- STL源代码剖析——STL算法stl_algo.h
前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法.本文剖析STL其它的算法,比如排序算法.合并算法.查找算法等等.在剖析的时候.会针对函数给出一些样例说明函数的使用.源代码出自SG ...
- 论C++STL源代码中关于堆算法的那些事
关于堆,我们肯定熟知的就是它排序的时间复杂度在几个排序算法里面算是比較靠上的O(nlogn)常常会拿来和高速排序和归并排序讨论,并且它还有个长处是它的空间复杂度为O(1), 可是STL中没有给我们提供 ...
随机推荐
- PE文件格式详解(二)
0x00 前言 上一篇讲到了PE文件头的中IMAGE_FILE_HEADER结构的第二个结构,今天从IMAGE_FILE_HEADER中第三个结构sizeOfOptionalHeader讲起.这个字段 ...
- 阿里云服务器ecs配置之安装jdk(转)
一.安装环境 操作系统:Centos 7.4 JDK版本:1.8 工具:Xshell5.Xftp5 二.安装步骤 第一步:下载安装包 (官网)链接: 下载适合自己系统的jdk版本,如图:我下载的是64 ...
- day46 mysql进阶
目录 一.约束条件 1 default默认值 2 unique唯一 2.1 单列唯一 2.2 联合唯一 3 primary key主键 3.1 主键的基本使用 3.2 主键的特性 4 auto_inc ...
- MISC学习记录 (一)
A记录 题目 他在看什么视频,好像很好看,不知道是什么网站的. 还好我截取了他的数据包,找呀找. key就是网站名称.格式ctf{key} tip:A记录的第一条. 解题链接 过程 下载解题链接中的文 ...
- 数据可视化之powerBI基础(二)PowerBI动态图表技巧:钻取交互
https://zhuanlan.zhihu.com/p/64406366 查看可视化图表的时候,我们可能想深入了解某个视觉对象的更详细信息,或者进行更细粒度的分析,比如看到2017年的总体数据,同时 ...
- PHP提示dyld: Library not loaded问题解决
Mac在命令行执行php命令时,如php -v 有错误提示: dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0..d ...
- 【API进阶之路】老板给我涨薪30%!如何通过SDK接口搞定千万级流量直播
摘要:看我如何通过API Explorer 的SDK接口搞定千万级流量直播. 最近几个月,我的变化其实还蛮大的,从一个被实习生“无视”的“前浪”,转变成了不仅能够解决技术问题还能解决业务问题(顺手还能 ...
- Fisher算法+两类问题
文章目录 一.Fisher算法 二.蠓的分类问题: 三.代码实现: 一.Fisher算法 二.蠓的分类问题: 两种蠓Af和Apf已由生物学家根据它们的触角和翼长加以区分(Af是能传播花粉的益虫,Apf ...
- element-ui设置级联选择器表单验证
data(){<el-form :model="ruleForm" :rules="rules" ref="ruleForm" lab ...
- git安装并与远程仓库关联相关配置
git是当前最流行的版本控制系统,下面简单记录一下git的安装及其与远程仓库的关联. git安装 打开git官网,下载对应的安装包. 双击运行安装包,安装过程中可以直接选择默认配置,一路next下去. ...