手写堆

堆是一颗完全二叉树 

小根堆(根节点最小值)


堆的存储:一维数组(注意下标不从0开始,因为0的左孩子还是0); x的左儿子:2x 右儿子:2x+1

基本操作 :下移down(x) 上移up(x)

手写堆(小根堆)

  1. 插入一个数 heap[++size] =x,up(size)
  2. 求集合当中的最小值 heap[1]
  3. 删除最小值 因为头节点不好直接删去,让最后一个点取代最小值再down: heap[1] =heap[size] size--,down(1);
  4. 删除任意一个元素 heap[k] = heap[size];size--down(k),up(k);只会执行一个
  5. 修改任意一个元素 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);
}

手写堆

上一篇:Expression小案例


下一篇:计算空间平面的交线