新闻详情

新闻详情

首页 / 资讯中心 / 详情

二叉树-堆1

发布时间:2026/9/5 23:10:04来源:尧图网络
二叉树-堆1
完美二叉树若像下图这样写当child为堆顶时计算parent为0不会是-0.5向上取整为0while判断parent为0符合条件进入循环此时ifa[child]a[parent],跳出循环。这只是程序能巧合运行将代码循环条件改为child0,即优化为上面代码即可向下调整算法1.接口是 HPDataType* a, int n, int parent2.算出孩子child以左孩子为例使用假设法始终让child为小的孩子3.1将parent与孩子对比若孩子小于双亲则交换同时继续判断交换下去的值是否需要再次交换所以将parent改为child重新计算child。2 否则break4.while循环若直至child到从下往上第一层parent为从下往上第二层若再执行一次31child不存在(超出了数组)此时child与parent都是从下往上第一层同一个节点不需要再循环所以循坏结束条件是childn.pop 删除在小堆的基础上用插入包含向上调整法根的左右子树是小堆交换首尾元素后删除尾元素左子树和右子树是小堆,将最小的堆顶元素交换到数组尾部然后使用向下调整算法将首元素与下面的两个元素中小的元素依次交换交换到不能交换为止建立小堆。删除的都是剩余数据中最小的数据所以会由小到大依次删除数据孩子给双亲以 以下图中算法给数组进行堆排序HPPush函数传的是结构体变量地址该函数额外申请内存存放堆需要消耗额外的空间来存放堆空间复杂度O(n)Destroy(hp);}以下图片没有传结构体变量指针原因而是直接传数组首元素地址直接在所给数组基础上排序不用再调用排序函数排序函数需要消耗额外的空间减少空间复杂度以下算法直接在所给数组上进行堆排序不用再调用排序函数减少空间复杂度向上调整算法排序数组/向下调整算法排序数组向上调整算法/向下调整算法可以分别构建大和小堆将无序的数组用向上调整算法/向下调整算法重新排列成小堆以向上调整算法建小堆为例再将数组的首尾元素交换此时尾元素不在数组中算将数组用向下调整法重新拍列成小堆将数组长度减一重复循环至循环结束即可得到一个由大到小的数组。即下方的//降序建小堆。反之亦然。void HeapSort(int* a, int n){// 降序建小堆// 升序建大堆for (int i 1; i n; i) 因为是直接在数组本身上调整排序所以直接从第二个元素开始与第 一个元素比较{AdjustUp(a, i);}int end n - 1;while (end 0){Swap(a[0], a[end]);AdjustDown(a, end, 0);--end;}}void TestHeap2(){int a[] { 4,2,8,1,5,6,9,7,2,7,9};HeapSort(a, sizeof(a) / sizeof(int));}int main(){TestHeap2();return 0;}向下调整算法排序数组还有另外一种算法按照大堆重新排列为了确保除根外的左右子树是按大堆排列我们可以从倒数第一个非叶子节点最后一个元素的双亲节点开始用向下调整算法调大堆倒数第二个非叶子节点开始调大堆以此类推直至除根外的左右子树是按大堆排列然后再用向下调整算法将无序的数组用向下调整算法建堆按照大堆重新排列再将数组的首尾元素交换此时尾元素不在数组中算将数组用向下调整法重新拍列成大堆将数组长度减一重复循环至循环结束。即可得到一个由小到大的数组。即下方的//降序建小堆。void HeapSort(int* a, int n){for (int i (n-1-1)/2; i 0; i--){AdjustDown(a, n, i);}int end n - 1;while (end 0){Swap(a[0], a[end]);AdjustDown(a, end, 0);--end;}}void TestHeap2(){int a[] { 4,2,8,1,5,6,9,7,2,7,9};HeapSort(a, sizeof(a) / sizeof(int));}int main(){TestHeap2();return 0;}向上调整算法logN向下调整算法logN向上调整算法排序数组O(N*logN)向下调整算法排序数组O(N*logN)向下调整算法建堆O(N)循环条件
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

当 AI 说起人话,数据却失语了——智能数据库的语言学 2026/9/5 23:49:14

当 AI 说起人话,数据却失语了——智能数据库的语言学

当 AI 说起人话,数据却失语了——智能数据库的语言学一句话主旨 2026 年,大模型终于把"人话"说得滴水不漏,但企业数据还没学会"被读懂"。本文借符号学的三把刀——语法学、语义学、语用学——切开数据库五十年历史&…

阅读更多 →
基于Flask与LayUI的图书管理系统:从CRUD到高并发事务处理 2026/9/5 23:49:14

基于Flask与LayUI的图书管理系统:从CRUD到高并发事务处理

简介:这是一套面向高校计算机专业本科生的毕业设计级图书管理系统实战资源,聚焦Web全栈开发能力训练,解决中小型图书馆、学校资料室等场景的图书数字化管理需求。资源包含可直接运行的FlaskLayUI源码与配套学术论文,覆盖需求分析、…

阅读更多 →
Level 4自动驾驶系统设计53——中间件 3 2026/9/5 23:49:14

Level 4自动驾驶系统设计53——中间件 3

本文介绍车载以太网gPTP(IEEE802.1AS)时间同步协议,通过PHY层硬件时间戳和双向对账模型,实现微秒级全网时钟对齐,消除多芯片时间色散导致的感知与规控幻觉,保障L4级大模型跨域并网调度的时空一致性。 10.4 以太网时间同步协议(gPTP / IEEE 802.1AS):微秒级全网统一时间…

阅读更多 →
电商后端重构实战:代码分层、数据库治理与缓存异步化改造 2026/9/5 23:49:14

电商后端重构实战:代码分层、数据库治理与缓存异步化改造

如果你维护过电商类后端系统,应该不会对下面的场景感到陌生:新同学入职后问“订单状态存在哪几个表”,没人能一句话回答;加一个商品标签,要牵连十几个类;核心订单接口响应时好时坏,却说不清慢在…

阅读更多 →
RH124问答3:从命令行管理文件 2026/9/5 23:49:14

RH124问答3:从命令行管理文件

目录 1. 怎么理解“Linux 中一切皆文件”?Linux是如何组织文件的? 2. Linux 目录树中有哪些重要的目录及其用途? 3. 如何识别一个路径名是绝对路径名还是相对路径名? 4. rm -r 和 rmdir (rm -d) 有什么区别? 5. 怎…

阅读更多 →
仅个人记录:毕设论文排版,中英文参考文献引用endnote 2026/9/5 23:46:14

仅个人记录:毕设论文排版,中英文参考文献引用endnote

一、endnote 中文等 alt2 Author Year Title Secondary Author Journal Volume Issue Pages (Author, Year) Author (Year) Secondary Author. Title [J ]. Journal|, |, Year, Volume|: Pages|. 二、交叉引用 干货 | 论文排版教程——多级列表 - 知乎 03图表交叉引用&a…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞