heap实现
2024-09-30 21:05:18
//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--;
}
}
最新文章
- iOS通过ARC管理内存(内容根据iOS编程编写)
- SCWS分词扩展在WINDOWS下的安装方法
- opencv图像操作
- Lost Cows(线段树 POJ2182)
- JavaScript判断文件的大小
- 夺命雷公狗ThinkPHP项目之----企业网站8之栏目的添加完善(无限极分类的完成)
- Linux环境变量文件environment, profile, bashrc含义
- <;a>;多颜色标签点击之后保持原色的一次实践, Ext Panel下解决及通用方案思路
- hdoj 2 括号配对问题【数组模拟实现+STL实现】
- JavaScript中依赖注入详细解析
- Inno Setup 安装inf文件的一个例子
- [ 流行的网络框架 ] AFN &; ASI
- EntityFramework Core高并发深挖详解,一纸长文,你准备好了吗?
- android wear开发之:建立可穿戴设备的应用 - Building Apps for Wearables
- MySQL 存储过程错误处理
- 细说java系列之反射
- EasyUI学习总结(一)——EasyUI入门
- AngularJS实战之filter的使用一
- 关于weblogic报UnsatisfiedLinkError Native Library xxx.so already loaded
- 在AbpZero中hangfire后台作业的使用——hangfire的调度
热门文章
- Roslyn导致发布网站时报错:编译失败
- MySql数据查询中 left join 条件位置区别
- 这样的设计是否有违背MVC设计原则??
- Python批量生成用户名
- C# datagrideview插件的使用
- LDA算法(入门篇)
- dutacm.club_1087_Common Substrings_(KMP)_(结合此题通俗理解kmp的next数组)
- iOS,Core Animation--负责视图的复合功能
- margin与padding如何进行区分
- MySql (二)入门语句和基本操作