news 2026/9/5 23:09:43

二叉树-堆1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉树-堆1

完美二叉树

若像下图这样写

当child为堆顶时,计算parent为0(不会是-0.5,向上取整为0),while判断parent为0符合条件进入循环,此时if(a[child]==a[parent]),跳出循环。这只是程序能巧合运行,将代码循环条件改为child>0,即优化为上面代码即可

向下调整算法

1.接口是 HPDataType* a, int n, int parent

2.算出孩子child(以左孩子为例),使用假设法,始终让child为小的孩子

3.(1)将parent与孩子对比,若孩子小于双亲则交换,同时继续判断交换下去的值是否需要再次交换,所以将parent改为child,重新计算child。

(2) 否则break

4.while循环,若直至child到从下往上第一层,parent为从下往上第二层,若再执行一次3(1),child不存在(超出了数组),此时child与parent都是从下往上第一层同一个节点,不需要再循环,所以循坏结束条件是child<n.

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)

循环条件

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 23:04:55

Faster-Whisper 语音转录实战:快 4 倍,内存还砍半

Faster-Whisper 语音转录实战&#xff1a;快 4 倍&#xff0c;内存还砍半 【免费下载链接】faster-whisper Faster Whisper transcription with CTranslate2 项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper 跑语音转文字&#xff0c;最头疼的就是音频…

作者头像 李华
网站建设 2026/9/5 23:04:06

低频重建实战:10颗超低音阵列与DSP低频管理如何消除听音位驻波谷

传统音响听起来“闷”、低频下潜不够、鼓点没有推动感时&#xff0c;很多人第一反应是换更大的落地箱、加后级、换线材。这次我们先不动主音箱&#xff0c;换一个工程化思路&#xff1a;保留原系统&#xff0c;在旁边并联一套由 10 颗超低音组成的分布式低频阵列&#xff0c;再…

作者头像 李华
网站建设 2026/9/5 22:59:49

基于51单片机与ADC0832的智能浇花系统仿真设计与实践

简介&#xff1a;本资源是一套面向单片机初学者与课程设计者的智能农业实践项目&#xff0c;基于STC89C52单片机与ADC0832模数转换芯片&#xff0c;实现土壤湿度检测、阈值可调、自动浇花及蓝牙远程监控功能&#xff0c;解决传统人工养护效率低、响应滞后的问题。压缩包共30个文…

作者头像 李华
网站建设 2026/9/5 22:57:51

3匹柜机选购避坑指南:美的酷省电Ultra型号、能效与省电实测全拆解

先说明一句&#xff0c;这篇文章不是单纯的优惠快报&#xff0c;而是把“3匹柜机选购”这件事拆开讲清楚。我们会从型号命名、能效参数、电费估算、活动规则、安装辅材、常见套路几个维度&#xff0c;完整过一遍美的酷省电Ultra KFR-72LW/N8KS1-1U这款3匹柜机&#xff0c;告诉你…

作者头像 李华
网站建设 2026/9/5 22:56:11

STM32H750 USB Host实战:寄存器级驱动与FAT32轻量栈

简介&#xff1a;本资源是面向嵌入式开发工程师与STM32进阶学习者的USB Host实战例程&#xff0c;聚焦STM32H750单片机驱动U盘&#xff08;USB Mass Storage Class&#xff09;的核心能力&#xff0c;解决高性能MCU实现外设存储接入、文件读写与系统集成的关键问题&#xff0c;…

作者头像 李华