您的位置:首页 > 其它

堆的实现例程

2016-05-11 18:51 253 查看
#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);
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: