【模板】堆

堆其实就是一颗完全二叉树,这颗树中的所有的爸爸都比儿子大(小也行..小就是小根堆)

用数组存,空间还是一倍的空间

由于n个节点的树的深度为log2n,所以堆的时间复杂度为O(n log2 n)

【插入push:】

 1 //小根堆的push
 2 void push(int x) {
 3     h[++h_size] = x;
 4     int now = h_size, next;
 5     while(now > 1) {
 6         next = now >> 1;
 7         if(h[now] < h[next])
 8             swap(h[now], h[next]);
 9         else break;
10         now = next;
11     }
12 }

【弹出pop:】

 1 //小根堆的pop
 2 int pop() {
 3     int ret = h[1];
 4     h[1] = h[h_size--];
 5     int now = 1, next;
 6     while((now << 1) <= h_size) {
 7         next = now << 1;
 8         //二叉树有两个孩子,左孩子和右孩子  
 9         if(next < h_size && h[next|1] < h[next]) ++next;
10         if(h[now] > h[next])
11             swap(h[now], h[next]);
12         else break;
13         now = next;
14     }
15     return ret;
16 }

【最值:】

就是维护后的堆(数组)里的第一个元素


堆有许多的用途:

  1. 堆排序:http://www.cnblogs.com/devilk-sjj/p/9024842.html
  2. 堆优化dijkstra:

猜你喜欢

转载自www.cnblogs.com/devilk-sjj/p/9024782.html