堆

堆结构是一种数组对象,是一棵完全二叉树。

性质

若当前节点编号为i,父结点则为i/2,左孩子为2i,右孩子为2i+1。

堆的结点数(le)数组长度len

下图为一个大根堆:每个结点均小于其父结点,树根是堆中最大的结点,小根堆反之。

添加

往堆中添加一个元素。

重复n次添加操作,即可建立一个小根堆。

实现流程(以小根堆为例)

先在堆尾加入1个元素,并把这个结点置为当前结点。

比较当前结点和它的父结点的大小,

如果当前结点小于父结点,交换它们的值,把父结点置为当前结点。

重复以上过程。

如果当前结点大于等于父结点,结束。

取出堆顶

从堆中取出并删除一个元素。

实现流程(以小根堆为例)

取出根结点的值。

把堆的最后一个结点(len)放到根的位置上,把根覆盖掉。

把堆的长度减一。

把根结点置为当前结点。

如果当前节点无儿子(pa>len/2),结束。

否则,比较当前节点与其子节点的值,

如果当前节点的值小于等于其子节点,结束。

反之则交换这两个结点的值,重复上述步骤,直至结束。

优先队列

priority_queue<Type,Container,Functional>

Type是数据类型,Container是容器类型。

(Container必须是用数组实现的容器,比如vector,deque等,但不能用list,STL里默认用vector)

Functional是比较函数,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大根堆。

头文件

include

定义小根堆

priority_queue<int,vector,greater>q;//升序队列

定义大根堆

priority_queue<int,vector,less>q;//降序队列

基本操作

empty()

如果队列为空,则返回真。

pop()

删除队头元素,即删除第一个元素。

push()

加入一个元素。

size()

返回优先队列中拥有的元素个数。

top()

返回优先队列队头元素,即优先级最高的元素。

在默认的优先队列中,优先级高的先出队。

在默认的int型中先出队的为较大的数。

堆排序

并非原创,仅是整理,请见谅

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 »