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中没有给我们提供 ...
随机推荐
- Chive CTF 2020 - Tiki
题目状态: OPEN - 正在试图解这道题CLOSED - 这道题还没有打开SOLVED - 解决了!鼓掌撒花! 赛事信息: 起止时间:2020-04-09 01:00 ~ 2020-04-12 01 ...
- Halcon采集图像Image Acquisition解析
很明显,图像的采集是所有机器视觉应用中必须解决的问题,HALCON提供了为各种图像采集设备执行这种交互的接口,图像采集的任务被简化为几行代码,只需几个操作符的调用,更重要的是,这种简单并不是以限制可用 ...
- 结合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot
本文主要介绍Spring @Value 注解注入属性值的使用方法的分析,文章通过示例代码非常详细地介绍,对于每个人的学习或工作都有一定的参考学习价值 在使用spring框架的项目中,@Value是经常 ...
- 浏览器如何解析css选择器?
浏览器会『从右往左』解析CSS选择器. 我们知道DOM Tree与Style Rules合成为 Render Tree,实际上是需要将Style Rules附着到DOM Tree上, 因此需要根据选择 ...
- python--动态网页渲染pyqt5
原文:https://blog.csdn.net/tymatlab/article/details/78647543 PyQt5 渲染动态网页 示例代码: # -*- coding: UTF-8 -* ...
- 数据可视化之 图表篇(一)Power BI可视化,几张图表认识疫情现状
近期国际疫情愈演愈烈,在这个特殊的时期,一方面仍要照顾好自己.不要为疫情防治添乱,另一方面,也可以利用疫情数据提升自己的数据分析和可视化技能. 下面是我制作的几个可视化图表,分别注释了每个可视化用到 ...
- 【学习记录】C#保存数据至CSV文档 & DateTime格式模式控制解释
数据类的定义: public class Result_Display { private string id; public string ID { get { return id; } set { ...
- mysql中常见约束
#常见约束 /* 含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性 分类:六大约束 NOT NULL:非空,用于保证该字段的值不能为空 比如姓名.学号等 DEFAULT:默认,用于 ...
- Spring Bean前置后置处理器的使用
Spirng中BeanPostProcessor和InstantiationAwareBeanPostProcessorAdapter两个接口都可以实现对bean前置后置处理的效果,那这次先讲解一下B ...
- 通过Vue实现的todolist
和接口对接的todolist因为有后台的存在,todolist获取的数据会一直存在不丢失(不管你如何刷新页面),思路如下: 首先得先搞到接口: 通过这个接口地址可以获取整段的数据,成功err为0. 于 ...