当前位置: 首页 > news >正文

数据结构入门——07堆

1.堆

堆(Heap)是一种特殊的完全二叉树数据结构,具有以下两个主要特性:

  • 结构特性
    • 堆是一棵完全二叉树,即除了最后一层的叶子节点外,每一层都是满的,最后一层的叶子节点从左向右依次排列。
  • 堆序性
    • 大堆(Max-Heap):对于每个节点,父节点的值大于或等于其子节点的值。大堆中,根节点的值是所有节点中最大的。
    • 小堆(Min-Heap):对于每个节点,父节点的值小于或等于其子节点的值。小堆中,根节点的值是所有节点中最小的。

 2.堆的实现

 

2.1堆的定义

typedef int HPDataType;
typedef struct Heap
{HPDataType* a;size_t size;size_t capacity;
}HP;

2.2堆初始化

void HeapInit(HP* php)
{assert(php);php->a = NULL;php->size = php->capacity = 0;
}

2.3堆的销毁

void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}

2.3打印

void HeapPrint(HP* php)
{assert(php);for (size_t i = 0; i < php->size; ++i){printf("%d ", php->a[i]);}printf("\n");
}

2.4向上调整堆的顺序(小堆)

向上调整,只是传入子节点下标,类似与向下调整算法。

void Swap(HPDataType* pa, HPDataType* pb)
{HPDataType tmp = *pa;*pa = *pb;*pb = tmp;
}void AdjustUp(HPDataType* a, size_t child)
{size_t parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent])     //小堆//if (a[child] > a[parent])   //大堆{Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

2.5向堆中插入数据

将数据插入到最后一个,然后利用向上调整算法

void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){size_t newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = realloc(php->a, sizeof(HPDataType)* newCapacity);if (tmp == NULL){printf("realloc failed\n");exit(-1);}php->a = tmp;php->capacity = newCapacity;}php->a[php->size] = x;++php->size;// 向上调整,控制保持是一个小堆AdjustUp(php->a, php->size - 1);
}

2.6向下调整堆的顺序(小堆)

void AdjustDown(HPDataType* a, size_t size, size_t root)
{size_t parent = root;size_t child = parent * 2 + 1;while (child < size){// 1、选出左右孩子中小的那个if (child + 1 < size && a[child+1] < a[child]){++child;}// 2、如果孩子小于父亲,则交换,并继续往下调整if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

2.7删除堆顶的数据。

// 删除堆顶的数据。
void HeapPop(HP* php)
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);--php->size;AdjustDown(php->a, php->size, 0);
}

2.8判断堆是否为空

bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}

2.9查看堆的大小

size_t HeapSize(HP* php)
{assert(php);return php->size;
}

2.10返回堆顶数据

HPDataType HeapTop(HP* php)
{assert(php);assert(php->size > 0);return php->a[0];
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring Boot自动配置原理
  • 乌龟对对碰在线版
  • 第七十四:前端实现点击页面某个菜单跳转到对应的锚点功能
  • 微信怎么恢复聊天记录?轻松4招,恢复消失的聊天记录
  • OpenCv图像处理: 时域滤波与频域滤波
  • flink车联网项目:维表离线同步(第69天)
  • socks4和socks5和https代理的区别
  • KNN 图像识别
  • Rust线程模型与线程创建
  • 【高阶数据结构】图
  • 美团笔试-测试方向
  • 理解Tomcat的IP绑定与访问控制
  • C语言小练习(伍)
  • 【问卷表单系统】TDuckX-8月更新速览!
  • 嵌入式面经篇十——驱动开发
  • JS 中的深拷贝与浅拷贝
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • es6(二):字符串的扩展
  • java2019面试题北京
  • java取消线程实例
  • JS专题之继承
  • k8s如何管理Pod
  • Linux gpio口使用方法
  • Lsb图片隐写
  • node和express搭建代理服务器(源码)
  • Protobuf3语言指南
  • spring boot 整合mybatis 无法输出sql的问题
  • V4L2视频输入框架概述
  • Xmanager 远程桌面 CentOS 7
  • 好的网址,关于.net 4.0 ,vs 2010
  • 将回调地狱按在地上摩擦的Promise
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个项目push到多个远程Git仓库
  • 源码安装memcached和php memcache扩展
  • 你对linux中grep命令知道多少?
  • ​数据链路层——流量控制可靠传输机制 ​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (二十六)Java 数据结构
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .Net 4.0并行库实用性演练
  • .Net 6.0--通用帮助类--FileHelper