堆简介
堆可以理解为一种完全二叉树,因此它可以存储在数组里。他的逻辑结构是一颗完全二叉树,物理结构是一个一维数组。
堆分类
堆被分为大堆和小堆
大堆
每一个子树都满足双亲大于两个孩子
小队
每个子树都满足双亲小于孩子
注意,堆是无序的,也就是左右可以互换
堆的数据结构
typedef int HPDataType;
typedef struct Heap
{
HPDataType* a; //指针,指向一个数组,数组里面是HPDataType
size_t size; //当前长度
size_t capacity; //最大长
}HP;
堆的基本操作
创建堆
void HeapInit(Heap* hp)
{
assert(hp);
hp->a = NULL;
hp->capacity = hp->size = 0;
}
没啥好说的,基本操作[滑稽]
销毁堆
void HeapDestory(Heap* hp)
{
assert(hp);
free(hp->a);
hp->a = NULL;
hp->size = hp->capacity = 0;
}
入堆
入堆有两步基本操作,先入堆,再向上调整。
以这个大堆为例,我们想插入一个60元素,第一步先把他放在堆中,也就是放在完全二叉树对应的数组的最后一个位置。随后进行向上调整。
先看60和他的双亲哪个大,如果双亲小于60则把60和双亲交换。
** 前面讲过 parent