堆…额,Priority Queue 和 Heap Sort 都有对 Heap 的应用。

Heap 不属于STL的容器组件,它是 Priority Queue 的助手,或者说是内部实现。

具体分析不讲解,自己看书…

实现 Heap 用的是  Vector + Heap算法。

实现了 插入、删除、取极值 等操作

这里主要要讲的是 Heap 算法。

主要还是以下几个算法:

  1. push_heap – 插入元素
  2. pop_heap – 取出元素
  3. sort_heap – 堆排序(要先保证是一个堆)
  4. make_heap – 建立堆(将现有的数据转化为heap)

 

Push_Heap :

  1. 将新元素放到最下一层叶子节点的从左至右第一个空格处
  2. 将新节点与父节点比较,如果比父节点大,就交换位置,否则结束
  3. 交换位置后,再将新节点与父节点比较(即到步骤2)
  4. 直到没有父节点或者比父节点小为止

具体代码如下:

可以看到真正的核心代码是在最后一个函数里面…

逻辑也是上面所述,这里就不多说了,看下一个。

 

Pop_Heap:

首先将根结点与最后一个结点交换,然后去掉根结点,然后调整堆。

调整方法:

从根开始先向下查找,将较大的上调,一直到叶子节点。

然后将先前 与根结点交换的最后一个结点  赋到这个点

然后再进行一次向上的查找

代码如下:

 

记于此- 接下来是 Sort_Heap(),即排序算法。

Sort_Heap:

因为每次pop_heap()可以获得 Heap 中最大的元素,如果持续对整个 Heap 做 pop_heap() 操作,每次将范围从后向前减少一个,当程序执行完毕时,我们就获得了一个递增序列。

代码如下:

我个人觉得看懂是没难度的。

就是每次将最大值放到最后,然后循环即可…

 

make_heap:

用算法将现有的数据转化为一个heap…

 

然后要注意的是: Heap没有迭代器。

 

最后做一个测试文档:

 

好,Heap的讲解就到这里。

【STL】Heap
Tagged on:
0 0 投票数
Article Rating
订阅评论
提醒

0 评论
内联反馈
查看所有评论