小根堆-数组实现

本文介绍了小根堆的特点,即父节点的值总是小于其孩子节点,且在实现中通常左孩子小于右孩子。文章详细阐述了小根堆的插入(push)和删除(pop)操作,push操作时数组长度增加,从下往上检查并调整堆;pop操作时获取最后一个元素值,并从根节点向下检查并调整堆。同时还提供了代码实现。
摘要由CSDN通过智能技术生成

特点:父节点永远比孩子节点小,不强制要求左孩子比右孩子小,但是为了实现方便,我令其左孩子比右孩子小。反之为大根堆。

push:插入元素

  1. 数组长度增加(注意:增加的不是本次插入所需要的位置,而是下次元素的位置,这句话能解释为什么pop的时候需要 - -se才能拿到当前堆中的最后一个元素)
  2. 从下往上判断是否满足小根堆特点,每次上移都是从当前节点移动到父节点,注意:是位置移动,真正的值不移动。

pop:删除元素

  1. 得到最后一个元素的值
  2. 从根节点往下判断是否满足小根堆特点,每次下移都是当前节点移动到左孩子节点,注意:是位置移动,真正的值不移动。

代码实现:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
 
using namespace std;
int heap[100],se = 0;		//堆的最大长度和位置

//插入
void push(int x){
   
	//自己节点的编号 
	int i = se++;		//注意是每次插入前就为下一个元素插入分配位置,并不是为本次插入分配位置 
	while(i > 0){
   
		//父亲节点编号 
		int p = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值