堆其实就是一颗完全二叉树,这颗树中的所有的爸爸都比儿子大(小也行..小就是小根堆)
用数组存,空间还是一倍的空间
由于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 }
【最值:】
就是维护后的堆(数组)里的第一个元素
堆有许多的用途:
- 堆排序:http://www.cnblogs.com/devilk-sjj/p/9024842.html
- 堆优化dijkstra: