interesting!堆:简单的说就是一棵完全二叉树的先序,满足任意父结点大于子结点的叫大根堆,反之则是小根堆。
建立
建立(小根堆)算法(简单粗略加通俗):
循环以下步骤
把此数(a[i])“塞”到堆尾,然后不停的和它父结点(a[i/2])比较,小就换。
给一个硬模拟的代码:
void put(int k)
{
int now,next;//now子结点,next父结点
heap[len++]=k;
now=len-1;
while(now>1)
{
next=now/2;
if(heap[now]>=heap[next])//只要符合小根堆的条件了就break
break;
swap(heap[now],heap[next]);//否则就交换
now=next;
}
}
其实不难懂,但是像我们这种懒癌党怎么会愿意打呢
以下是直接用STL库函数的代码,两行解决(需添加algorithm、iostream及using namespace std头文件):
void put(int k)
{
heap[len++]=k;
//push_heap(heap,heap+len);
push_heap(heap,heap+len,greater<int>());
}
好吧。似乎并没有什么用……
其他堆的东西继续写,也在这个分类,后面会有例子的,