//目录

堆的实现例程

#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

 

posted @ 2016-05-11 18:51  小草的大树梦  阅读(264)  评论(0编辑  收藏  举报