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中没有给我们提供 ...
随机推荐
- Video.js随笔记
下载与介绍 Video.js是一款web视频播放器,支持html5和flash两种播放方式.更有自定义皮肤,插件,组件,语言还有丰富的选项配置. 官网下载地址:https://videojs.com/ ...
- Java面向对象详解-下
一. static static:静态的,可以用来修饰属性.方法.代码块(或初始化块).内部类 static修饰属性(类变量): 由类创建的所有的对象,都共用这一个属性 当其中一个对象对此属性进行修改 ...
- requests接口自动化9-共享session和传递cookie
前言: session:用requests.session()创建会话,可以将会话信息传递给其他接口 cookie:用RequestsCookieJar或者cookie字典传递cookie信息 fil ...
- python 并发专题(九):基础部分补充(一)进程
概念 串行:所有的任务一个一个的完成. 并发:一个cpu完成多个任务.看起来像是同时完成. 并行:多个cpu执行多个任务,真正的同时完成. 阻塞:cpu遇到IO就是阻塞. 非阻塞:没有IO,就叫非阻塞 ...
- 数据可视化实例(十二): 发散型条形图 (matplotlib,pandas)
https://datawhalechina.github.io/pms50/#/chapter10/chapter10 如果您想根据单个指标查看项目的变化情况,并可视化此差异的顺序和数量,那么散型条 ...
- hihoCoder 1050 树中的最长路 最详细的解题报告
题目来源:树中的最长路 解题思路:枚举每一个点作为转折点t,求出以t为根节点的子树中的‘最长路’以及与‘最长路’不重合的‘次长路’,用这两条路的长度之和去更新答案,最终的答案就是这棵树的最长路长度.只 ...
- 6 个珍藏已久 IDEA 小技巧,这一波全部分享给你!
每周趣图 产品经理设计体验/用户实际体验 本周就不写技术分析文章了,分享几个珍藏已久的 IDEA 的「骚技巧」,助你快速完成代码. 还等什么?赶紧上车吧...... 先赞后看,养成习惯.微信搜索「程序 ...
- mysql常见数据类型
#常见的数据类型 /* 数值型: 整型 小数: 定点数 浮点数 字符型: 较短的文本:char.varchar 较长的文本:text.blob(较长的二进制数据) 日期型: */ #一.整型 /* 分 ...
- Go的100天之旅-06数组和Slice
目录 数组 Slice 数组 Go的数组和其它语言基本上一样,是长度固定的特定类型元素组成的序列,这基本上是所有语言数组的特性.和其它语言相比差异主要在声明和初始化的写法上,下面是简单声明一个数组: ...
- 哈夫曼编码+python实现
关于哈夫曼树怎么构建的.哈夫曼编码怎么求,请参考 哈夫曼树及python实现 这些基础的东西就不在这里阐述了,本文直接上代码. 参考链接:哈夫曼树的 Python 实现 哈夫曼树的构建和编码 ''' ...