#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