//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--;
}
}

最新文章

  1. iOS通过ARC管理内存(内容根据iOS编程编写)
  2. SCWS分词扩展在WINDOWS下的安装方法
  3. opencv图像操作
  4. Lost Cows(线段树 POJ2182)
  5. JavaScript判断文件的大小
  6. 夺命雷公狗ThinkPHP项目之----企业网站8之栏目的添加完善(无限极分类的完成)
  7. Linux环境变量文件environment, profile, bashrc含义
  8. &lt;a&gt;多颜色标签点击之后保持原色的一次实践, Ext Panel下解决及通用方案思路
  9. hdoj 2 括号配对问题【数组模拟实现+STL实现】
  10. JavaScript中依赖注入详细解析
  11. Inno Setup 安装inf文件的一个例子
  12. [ 流行的网络框架 ] AFN &amp; ASI
  13. EntityFramework Core高并发深挖详解,一纸长文,你准备好了吗?
  14. android wear开发之:建立可穿戴设备的应用 - Building Apps for Wearables
  15. MySQL 存储过程错误处理
  16. 细说java系列之反射
  17. EasyUI学习总结(一)——EasyUI入门
  18. AngularJS实战之filter的使用一
  19. 关于weblogic报UnsatisfiedLinkError Native Library xxx.so already loaded
  20. 在AbpZero中hangfire后台作业的使用——hangfire的调度

热门文章

  1. Roslyn导致发布网站时报错:编译失败
  2. MySql数据查询中 left join 条件位置区别
  3. 这样的设计是否有违背MVC设计原则??
  4. Python批量生成用户名
  5. C# datagrideview插件的使用
  6. LDA算法(入门篇)
  7. dutacm.club_1087_Common Substrings_(KMP)_(结合此题通俗理解kmp的next数组)
  8. iOS,Core Animation--负责视图的复合功能
  9. margin与padding如何进行区分
  10. MySql (二)入门语句和基本操作