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>()); }
好吧。似乎并没有什么用……
其他堆的东西继续写,也在这个分类,后面会有例子的,