如何构造大根堆

本文介绍了如何构造大根堆,重点在于大根堆的定义及其C语言实现过程。通过确保每个节点的值大于其子节点的值,从最后一个非叶子节点向上调整,可以构建出大根堆。大根堆在解决topN问题、优先队列和堆排序等问题中具有应用价值。
摘要由CSDN通过智能技术生成

如何构造一个大顶堆(C实现)

基础知识

堆是一种二叉树结构,但是他的物理保存是一个数组,如下图

请添加图片描述

实际的保存形式为

{5,4,1,25,68,8,1,5,2,3}

设每个结点下标为i

则左孩子:2i+1

右孩子:2i+2

最后一个非叶子结点:arr.length/2-1 //因为 每一个结点的孩子结点下标不能超过数组长度arr.length,所以非叶子结点孩子下标2*i+1<=arr.length-1 ,下标从0开始

**大根堆的概念:**从根结点开始,每一个结点的值都大于其两个孩子结点的值

接下来我们通过算法将该数组构造成一个大根堆

构造大根堆

算法思路: 如果以某结点 i 为树,它的左右子树都是一个大根堆,那我们只要将arr[i]max(arr[2*i+1], arr[2*i+2])进行比较,如果arr[i] < max(arr[2*i+1], arr[i*2+2]),就将两者交换,然后继续往下交换,直到arr[i] > max(arr[i*2+1], arr[i*2+2]),或者i*2+1>length,就可以完成大根堆的构造

现在问题就是,如果保证左右子树都是大根堆,我们通过动态规划的思想,从最后一个非叶子结点一直往上推,就能保证每一个结点的左右子树都为大根堆

c语言实现如下:

#include<stdio.h>
#include<stdlib.h> 

void createHeap(int arr[10]);
void upAdjust(int root
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值