堆是一颗完全二叉树
小根堆(根节点最小值)
堆的存储:一维数组(注意下标不从0开始,因为0的左孩子还是0); x的左儿子:2x 右儿子:2x+1
基本操作 :下移down(x) 上移up(x)
手写堆(小根堆)
- 插入一个数 heap[++size] =x,up(size)
- 求集合当中的最小值 heap[1]
- 删除最小值 因为头节点不好直接删去,让最后一个点取代最小值再down: heap[1] =heap[size] size--,down(1);
- 删除任意一个元素 heap[k] = heap[size];size--down(k),up(k);只会执行一个
- 修改任意一个元素 heap[k] =x,down(k),up(k);
down(x)
void down(int u)
int t=u//t表示三个点的最小值
if(u*2<=size&&h[u*2]<h[t] t=u*2);
if(u*2+1<=size&&h[u*2+1]<h[t] t=u*2+1);
if(u!=t)
{swap(h[u],h[t]);
down(t);
}