层序遍历
用一个数组h构建堆
总长度为Size
节点下标为i
左子节点下标为2i+1
右子节点下标为2i+2
构造堆一般用上浮操作down
下面这个例子是构建最小堆,如果要最大堆只用把down那里的h[t] > h[l]改成<就行了
删除操作都一样的
for(int i=n/2;i>=0;i--)//从最后一个叶节点的父节点(非叶子结点)往上遍历down,确保是小根堆
down(i);
void down(int u){//与左右儿子结点比较,如果自己比较大就交换后继续down
int t = u;
int l=2*u+1,r=2*u+2;
if (l < Size && h[t] > h[l])
t = l;
if (r < Size && h[t] > h[r])
t = r;
if (u != t)
{
swap(h[u], h[t]);
down(t);
}
}
删除堆顶元素,重新组织好一个heap:
h[0]=h[Size--];
down(0);
你可以看出来,上面这些做法,无非就是利用这个堆,输出一个最大值,最小值而已
说是堆排序,排序算法,费时费力,主要是考考你罢了。
优先队列的cmp跟普通cmp的大小关系逻辑正好相反,焯
priority只写参数类型,但+decltype是函数,greater不是
cmp的返回值类型写auto,写bool都是错的。而且大括号后还要加一个冒号;