堆学习笔记(带有例题与详细讲解)

本文总结了堆的概念,包括大根堆和小根堆的定义,以及它们的存储方式和基本操作。通过代码展示了小根堆的Put_Heap和Get_Heap操作,并提供了几道利用堆解决的简单题目,包括插入、查找最小值和删除最小值的操作。最后,探讨了一道使用堆解决的贪心问题,介绍了如何利用堆进行求解。
摘要由CSDN通过智能技术生成

还是建议全屏阅读 O~

今天老师讲了一下堆,就在这里做一个小结吧~
堆,其实可以把它理解为一棵完全二叉树。我们所见到和用到的堆大多数都是二叉堆,所以这里直接把二叉堆称为堆。堆分为大根堆和小根堆。所谓大根堆 就是一颗完全二叉树,但是他的以每一个一节点作为根节点的子树中,根节点,也就是root是字数中最大的至(包括以整个完全二叉树和根节点)。而小根堆则反之。堆在我们的脑海之中是一棵完全二叉树,但是他实际是用一个数组来存储的,支持两种操作。我们一般把存储堆的数组命名为 Heap ,(老师说最好大写),支持的两种操作分别是:

  • Put_Heap 用于在堆的末尾插入一个新的元素并且维护原本堆
  • Get_Heap 删除根节点并且选举出新的根节点,即维护这个堆
    同时,堆还有一个重要的性质:
    那就是:
若我们设一个有儿子的一个节点在数组中的位置为 father, 那么他的两个儿子的位置分别为:
father * 2, father * 2 + 1
若不理解的可以自行在纸上画出一棵二叉树来研究。

下面是小根堆中两种操作的代码:

void Put_Heap(int x) {
   //x为要插入的元素
	Heap[++Heap_Size] = x;
	int fa, now = Heap_Size;
	while (now > 1) {
   
		fa = now >> 1;
		if (Heap[fa] <= Heap[now]) break;
		swap(Heap[fa], Heap[now]);
		now = fa;
	}
}
int Get_Heap() {
   
	int now, son, res;
	res = Heap[1];
	Heap[1] = Heap[Heap_Size--];
	now = 1;
	while (now * 2 <= Heap_Size) {
   //没有越界 
		son = now * 2;//先暂定为和左儿子交换 
		if (son < Heap_Size && Heap[son + 1] < Heap[son]) {
   //如果存在右儿子且右儿子小于左儿子 
			son++;//现在的下标就是右儿子的下标 
		}
		if (Heap[now] <= Heap[son]) {
   
			break;//已经满足小根堆,就直接跳出 
		
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值