堆是一种简单高效的数据结构,在很多常用算法的优化上大显身手。
堆的常数很小,同样的数据,用堆来排序和快排的速度几乎相等,但是平衡树的速度会慢很多,Splay慢了两倍多。。
简单的学习一下堆,把模板发出来与大家分享
CODE(小根堆,排序):
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 200010 #define INF 0x7f7f7f7f using namespace std; struct SmallHeap{ int num[MAX]; int last; int Top() { return num[1]; } void Insert(int x) { num[++last] = x; int now = last; while(num[now] < num[now >> 1] && now > 1) swap(num[now],num[now >> 1]),now >>= 1; } void Pop() { num[1] = num[last--]; int now = 2; while(now <= last) { if(num[now] > num[now + 1]) ++now; if(num[now] < num[now >> 1]) swap(num[now],num[now >> 1]),now <<= 1; else break; } } }heap; int cnt; int main() { cin >> cnt; for(int x,i = 1;i <= cnt; ++i) { scanf("%d",&x); heap.Insert(x); } for(int i = 1;i <= cnt; ++i) { printf("%d\n",heap.Top()); heap.Pop(); } return 0; }