什么是堆?如何区分大堆和小堆?什么是向上调整和向下调整算法?如何实现堆排序?一篇文章带你秒杀考研数据结构堆。

堆简介

堆可以理解为一种完全二叉树,因此它可以存储在数组里。他的逻辑结构是一颗完全二叉树,物理结构是一个一维数组。

堆分类

堆被分为大堆和小堆

大堆

每一个子树都满足双亲大于两个孩子
在这里插入图片描述

小队

每个子树都满足双亲小于孩子
在这里插入图片描述
注意,堆是无序的,也就是左右可以互换

堆的数据结构

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值