#define MAX_HEAP_LEN 100
static int heap[MAX_HEAP_LEN];
static int heap_size = 0; ///堆中的元素个数
static void swap (int *a,int *b) {
int temp=*a;
*a=*b;
*b=temp;
}
static void percolate_up(int i) {
///向上调整
if(i==0) return ; ///节点i已经是根节点了
int done=0;
while((i!=0)&&(!done)) {
if(heap[i]>heap[(i-1)/2]) {
swap(&heap[i],&heap[(i-1)/2]);
} else {
done =1;
}
i=(i-1)/2;
}
}
static void percolate_down(int i) {
///向下调整
if(2*i+1>heap_size) return ; ///节点i是叶子节点
int done=0;
while((2*i+1<heap_size)&&(!done)) {
i=i*2+1; ///跳转到左孩子
if((i+1<heap_size)&&(heap[i+1]>heap[i])) {
///在这两个孩子中找到较大者
i++;
}
if(heap[(i-1)/2]<heap[i]) {
swap(&heap[(i-1)/2],&heap[i]);
} else {
done = 1;
}
}
}
static void delete (int i) {
int last = heap[heap_size-1]; ///获取最后一个
heap_size--; ///收缩堆
if(i==heap_size) return ;
heap[i]=last; ///用最后的节点覆盖当前的
percolate_down(i);
}
int delete_max() {
int ret = heap[0];
delete(0);
return ret;
}
void insert (int new_data) {
if(heap_size>=MAX_HEAP_LEN) return;
heap_size++;
heap[heap_size-1]=new_data;
percolate_up(heap_size-1);
}
void build () {
///建堆算法
for(int i=heap_size/2; i>0; i--)
percolate_down(i);
}