【算法与数据结构】堆 heap - 基于数组实现的完全二叉树

#include <stdio.h>
#include <string.h>

#define MAXSIZE 100

typedef struct heap {
    int data[MAXSIZE];
    int size;
} heap;

void heap_init(heap *h) {
    h->size = 0;
    memset(h->data, 0, 100 * sizeof(int));
}

// 每次插入元素时,放到二叉树末尾,然后执行上滤操作
void heap_up(heap *h, int pos) {
    int parent = (pos - 1) / 2;
    while (parent >= 0) {
        if (h->data[parent] < h->data[pos]) {
            int tmp = h->data[parent];
            h->data[parent] = h->data[pos];
            h->data[pos] = tmp;
        } else {
            break;
        }
        heap_up(h, parent);
    }
}

int insert(heap *h, int v) {
    if (h->size == MAXSIZE) {
        return -1;
    }
    h->data[h->size] = v;
    heap_up(h, h->size);
    h->size++;
    return 0;
}

int get_max(heap *h) {
    return h->data[0];
}

// 每次删除堆顶元素时,把二叉树末尾元素放到堆顶,然后执行下滤操作
void heap_down(heap *h, int pos) {
    while ((pos * 2 + 1) < h->size) {
        int lc = h->data[pos * 2 + 1];
        if (pos * 2 + 2 < h->size) {
            int rc = h->data[pos * 2 + 2];
            if (lc < rc) {
                if (h->data[pos] < rc) {
                    int tmp = h->data[pos * 2 + 2];
                    h->data[pos * 2 + 2] = h->data[pos];
                    h->data[pos] = tmp;
                    pos = pos * 2 + 2;
                } else {
                    break;
                }
            } else {
                if (h->data[pos] < lc) {
                    int tmp = h->data[pos * 2 + 1];
                    h->data[pos * 2 + 1] = h->data[pos];
                    h->data[pos] = tmp;
                    pos = pos * 2 + 1;
                } else {
                    break;
                }
            }
        } else {
            if (h->data[pos] < lc) {
                int tmp = h->data[pos * 2 + 1];
                h->data[pos * 2 + 1] = h->data[pos];
                h->data[pos] = tmp;
                pos = pos * 2 + 1;
            } else {
                break;
            }
        }
    }
}

int delete_max(heap *h) {
    int max = h->data[0];
    h->size--;
    h->data[0] = h->data[h->size];
    h->data[h->size] = 0;
    heap_down(h, 0);
    return max;
}

int main(void) {
    heap h;
    heap_init(&h);
    int arr[] = {3, 2, 5, 4, 9, 10};
    for (int i = 0; i < 6; i++) {
        insert(&h, arr[i]); 
        for (int i = 0; i < 6; i++) {
            printf("%d\t", h.data[i]);
        }
        printf("\n");
    }
    
    delete_max(&h);
    for (int i = 0; i < 6; i++) {
        printf("%d\t", h.data[i]);
    }
    printf("\n");
    
    delete_max(&h);
    for (int i = 0; i < 6; i++) {
        printf("%d\t", h.data[i]);
    }
    printf("\n");

    delete_max(&h);
    for (int i = 0; i < 6; i++) {
        printf("%d\t", h.data[i]);
    }
    return 0;
}

输出:

3	0	0	0	0	0	
3	2	0	0	0	0	
5	2	3	0	0	0	
5	4	3	2	0	0	
9	5	3	2	4	0	
10	5	9	2	4	3	
9	5	3	2	4	0	
5	4	3	2	0	0	
4	2	3	0	0	0
发布了295 篇原创文章 · 获赞 158 · 访问量 101万+

猜你喜欢

转载自blog.csdn.net/kikajack/article/details/99617717