堆是使用顺序结构实现的完全二叉树,除了存储数据外,还具有排序和解决 TOP-K 问题的功能。
小根堆的堆顶数据最小,大根堆的堆顶数据最大。通过不断选出最大/最小值,可实现排序或获取前 K 个元素。
一、初始化
将交换操作封装为函数以便复用。
Heap.h
typedef int HPDataTypt;
typedef struct Heap {
HPDataTypt* a; // 数组指针,指向存储数据的数组
int size; // 当前已存储的有效数据个数
int capacity; // 最大容量
} HP;
void HeapInit(HP* php); // 初始化
void HeapDestroy(HP* php); // 销毁
Heap.c
void HeapInit(HP* php) {
assert(php);
php->a = (HPDataTypt*)malloc(sizeof(HPDataTypt) * 4);
if (php->a == NULL) {
perror("malloc fail");
return;
}
php->size = 0;
php->capacity = 4;
}
void Swap(HPDataTypt* p1, HPDataTypt* p2) {
HPDataTypt tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
参数 php 指向主函数中 HP 结构体变量的地址。若为空说明结构体未分配,需断言检查。
二、插入
堆的底层是数组。插入数据后需调整以保持堆性质(以大根堆为例)。






