最小堆创建,排序。C语言实现

本文介绍了最小堆的概念,包括完全二叉树和优先队列的关系,以及最小堆与最大堆的区别。通过数组实现最小堆的创建,从最后一个非叶子节点开始,调整父节点与子节点的大小关系。建堆后,通过打印根节点并下沉最后一个叶节点进行排序。以9,3,7,6,5,1,10,2为例,展示了建堆和排序的过程。" 134468886,19615628,Spring Cloud Gateway详解,"['网关', 'Spring Cloud', 'Java', '运维']
摘要由CSDN通过智能技术生成

开篇说一下关于树相关的类型:

树(至少2个子节点)=>  二叉树(最多2个子节点) => 完全二叉树(有一个左子节点或者同时有左右子节点) 

=> 最小堆也叫优先队列,任何一个父节点都不大于左右子节点。

最小堆对应的有最大堆,区别在于父节点比子节点小还是大。 最小堆可以使用链表表示(需要三个指针),也可以用数组表示。

在这里只说明数组实现的最小堆创建和排序。

首先说最小堆的位置都满足此规律: 第一个元素从数组下标1开始,每个节点n的父节点都是  n/2, 子节点是 2*n , 2*n+1。所以创建也是从数组1下标开始。

创建方法:

从最后一个非叶子节点开始,依次向根节点1遍历, 比较当前节点与子节点的大小,如果父节点比任一子节点大,则调换两者位置或交换值, 同时需要对新的子节点重新对比。 

int h[] ; //无序队列,从下标1开始。
int n = sizeof(h)/sizeof(*h) - 1; //n是要创堆的元素个数
static inline void swap(int a, int b){
    h[a] ^= h[b]; h[b] ^= h[a]; h[a] ^=h[b];
}

void strip(int 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值