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

堆的相关知识点

目录

大小堆

堆的实现

堆的创建

堆的销毁

交换

向上调整

向下调整

弹出首个元素

取出首个元素

判空

堆插入


大小堆

大堆:最上面的数字是最小的,越往下越大

小堆:最上面的数字是最大的,越往下越小

堆的复杂程度:

由错位相减我们可以知道T(n)= n - log(n-1) = n,所以建堆的复杂程度为O(N)

堆的实现

堆的创建

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

堆的销毁

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

交换


void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}

向上调整


void Adjustup(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;int parent = (child - 1) / 2;}else{break;}}
}

向下调整

void AdjustDown(HPDataType* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){if (child + 1 < n && a[child] > a[child + 1])//先假设左孩子是小的{child++;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else {break;}}
}

弹出首个元素

void HPPop(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);
}

取出首个元素

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

判空


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

堆插入


void HPPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){int newcapacity = (php->capacity == php->size == 0 ? 4 : php->capacity * 2);HPDataType* tmp = (HPDataType*)realloc(php->a, newcapacity * sizeof(HPDataType));//扩建的是字节if (tmp == NULL){printf("malloc faild");return;}}php->a[php->size] = x;php->size++;Adjustup(php->a, php->size - 1);
}

相关文章:

  • 【数据结构】二叉树链式结构——感受递归的暴力美学
  • 十大排序的稳定性和时间复杂度
  • 【proteus经典项目实战】51单片机用计数器中断实现100以内的按键计数并播放音乐
  • SAP MM学习笔记46 - 购买中的出力管理(消息管理)
  • IntelliJ IDEA 直接在软件中更新为最新版
  • 论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps
  • mysql1055报错解决方法
  • git报错403,git项目拉取不下来
  • VSCode | 修改编辑器注释的颜色
  • opencv grabCut前景后景分割去除背景
  • 455 分发饼干
  • 二级医院LIS系统源码,医学检验系统,支持DB2,Oracle,MS SQLServer等主流数据库
  • 如何快速抓取小红书帖子评论?两大实战Python技巧揭秘
  • OpenHarmony 开发
  • vue3前端开发-小兔鲜项目-路由缓存的更新解决办法
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Angular4 模板式表单用法以及验证
  • angular组件开发
  • Debian下无root权限使用Python访问Oracle
  • ES6核心特性
  • idea + plantuml 画流程图
  • js如何打印object对象
  • laravel with 查询列表限制条数
  • MYSQL 的 IF 函数
  • MySQL用户中的%到底包不包括localhost?
  • 阿里云前端周刊 - 第 26 期
  • 聊聊directory traversal attack
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 试着探索高并发下的系统架构面貌
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #php的pecl工具#
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (zt)最盛行的警世狂言(爆笑)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (四)软件性能测试
  • (一)认识微服务
  • (转) ns2/nam与nam实现相关的文件
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)德国人的记事本
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转载)Google Chrome调试JS
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NetCore部署微服务(二)
  • .net网站发布-允许更新此预编译站点
  • .NET中的Exception处理(C#)
  • .net中生成excel后调整宽度
  • .NET周刊【7月第4期 2024-07-28】
  • @JSONField或@JsonProperty注解使用