- 堆就是在二叉树上满足每一个根节点都大于两个子节点的数据结构。
- 堆常用来解决两个问题,堆排序和优先队列。
- 堆的核心在于如何维护,通过比较来进行递归维护。
- 相比于队列加二分插入的实现,堆可以基于已经有的结果在最长lgn的时间内实现,通常比较到无需换位即可,而二分插入往往都要lgn,
#define maxn 100
int heap[maxn+10];
int lena = 10;
int lenh;
void heapify(int idx){
int flag = idx;
if(2*idx <= lenh && heap[flag] < heap[2*idx])
flag = 2*idx;
if(2*idx+1 <= lenh && heap[flag] < heap[2*idx+1])
flag = 2*idx+1;
if(flag != idx){
swap(heap[idx], heap[flag]);
heapify(flag);
}
}
void build(){
for(int i = lena/2; i >= 1; --i){
heapify(i);
}
}
void inserts(int v){
lena++;
heap[++lenh] = v;
int now = lenh;
while(heap[now] > heap[now/2] && now != 1){
swap(heap[now], heap[now/2]);
now /= 2;
}
}
void heap_sort(){
build();
for(int i = lena; i > 1; --i){
swap(heap[1], heap[i]);
lenh--;
heapify(1);
}
}