堆的实现
堆的本质是一二叉树,并且是一颗完全二叉树。
堆分为大堆和小堆,大堆就是在堆顶的元素的值是这个完全二叉树中的最大值,小堆刚好相反,是最小值。在树这个数据结构定义的时候是递归定义的所以也就满足,一个树中子数的更节点是最大或者最小(取决与建立大堆还是小堆)。
堆的建立
堆的建立过程是一个进行比较的过程,也就是说,每次插入一个元素,就需要对堆进行调整,怎么调整?当然在插入的时候,我们就已经确定需要建立大堆还是小堆,所以我们在插入的时候,每次都插入到堆的尾部,应为堆是一个完全二叉树,所以,我们插入到尾部后就需要和父节点的值进行比较,再进行调换,如果发现不用调换就说明插入完成。
堆的建立是基于一个顺序表的数据。
具体是的实现:
void Swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
// 调整堆
void AdjustUp(int arr[], size_t size, size_t index)
{
if (arr == NULL)
{
return;
}
size_t child = index;
size_t parent = (size - 1 - 1) / 2;
while (child > 0)
{
if (arr[child] < arr[parent])
{
Swap(&arr[child], &arr[