二叉树(堆)

堆的性质:

堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。
大堆:任何父亲≥孩子
小堆:任何父亲≤孩子

接下来,我们要做的便是对堆进行增加和删除:

首先是增加操作,我们这里采用向上调整的方式来进行增加:

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;parent = (parent - 1) / 2;}else{break;}}
}

时间复杂度:O(logN)

比如我们有这样一组数据:

int a[] = { 65,100,70,32,50,60 };

然后对其进行操作如下;

void HeapPush(HP* php, HPDataType x)
{assert(php);//扩容if (php->size == php->capacity){int newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newCapacity);if (tmp == NULL){perror("realloc fail");exit(-1);}php->a = tmp;php->capacity = newCapacity;}php->a[php->size] = x;php->size++;AdjustUP(php->a, php->size - 1);
}

运行结果为:

结果:

嘿嘿,怎么着?这不就是小堆嘛?

那么呢,接下来我们便进行数据的删除操作:

我们先来考虑这样一个问题:删除哪个数据最有价值呢?

显然是删除根because挪动覆盖第一个位置根,关系全乱了,剩下的值,不一定是堆

你看,你看,这不是没乱吗?

雷布斯:这绝对是来捣乱的(这种情况呢,显然只是一个巧合)

不信,我们再来看一个:

你看全乱了,所以这种方式好不好呢?

那不好怎么办呢?别慌,让我们娓娓道来:

我们不影响其他位置,加上尾插和尾删的效率很好,所以只把要删除的元素和最后一个元素换换位置,你看:

向下调整: 

void AdjustDown(HPDataType* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){//找出小的那个孩子if (child+1 < n && a[child + 1] < a[child]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);//继续向下调整parent = child;child = parent * 2 + 1;}else{break;}}
}

时间复杂度:O(logN)

 其次,我们仔细看,经过这一系列操作,我们是不是还把这一组数据中的次小元素给找了出来?

那我们再继续pop,是不是又找到了第三小?依次反复……是不是就成为了排序

我们来操作一下,对某个数组进行排序。

如果要求的是升序,应该选择 大堆 还是 小堆 呢?

升序:建大堆

堆顶跟最后一个交换        最大的数据排好了        剩下数据向下调整,选出次大的,代价是logN

合计是:N*logN

//升序
void HeapSort(int* a, int n)
{//建堆	(大堆)or (小堆)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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/110033.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 673. 最长递增子序列的个数

2023.9.13 做本题之前先复习一下 最长递增子序列 &#xff0c;在此基础上还要加个count数组&#xff0c;用于记录当前下标 最长递增子序列的个数。 本题还是有些难度&#xff0c;日后再来二刷。

每日一题~中序后序遍历构造二叉树

原题链接&#xff1a;106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 后序遍历分析图 中序遍历分析图 不难看出后序遍历的结果中的最后一个元素就是根节点&#xff0c;倒数第二个元素则是根节点的…

Electron和vue3集成(推荐仅用于开发)

本篇我们仅实现Electron和vue3通过先运行起vue3项目&#xff0c;再将vue3的url地址交由Electron打开的方案&#xff0c;仅由Electron在vue3项目上套一层壳来达到脱离本机浏览器运行目的 1、参考快速上手 | Vue.js搭建起vue3初始项目 npm install -g vue npm install -g vue/c…

深入理解Linux网络笔记(一):内核是如何接收网络包的

本文为《深入理解Linux网络》学习笔记&#xff0c;使用的Linux源码版本是3.10&#xff0c;网卡驱动是Intel的igb网卡驱动 Linux源码在线阅读&#xff1a;https://elixir.bootlin.com/linux/v3.10/source 1、内核是如何接收网络包的 1&#xff09;、Linux网络收包总览 在TCP/I…

手刻 Deep Learning -第壹章 -PyTorch教学-激励函数与感知机入门(上)

一、前言 本文接续前篇教学 Pytorch 与线性回归 &#xff0c;本文着重在 Activation Function &#xff08; 中文称 激励函数 &#xff09;&#xff0c;我们会介绍激励函数 &#xff08;也有人称 激活函数&#xff1f; 激发函数&#xff1f; &#xff09; 为什么会有用&#xf…

vim,emacs,verilog-mode这几个到底是啥关系?

vim&#xff1a;不多说了被各类coder誉为地表最强最好用的编辑器&#xff1b;gvim&#xff0c;gui vim的意思&#xff1b; emacs&#xff1a;也是一个编辑器&#xff0c;类似vscode&#xff1b; vim在使用的时候为了增强其功能&#xff0c;有好多好多插件&#xff0c;都是以.…

差分方程模型:蛛网模型

在完全竞争的市场经济中&#xff0c;一个时期某种消费品如猪肉的上市量远远大于需求量&#xff0c;由于销售不畅导致价格下降&#xff0c;生产者发现养猪赔钱&#xff0c;于是转而经营其它农副产品。过一段时间猪肉上市量就会下降&#xff0c;此时供不应求导致价格上涨&#xf…

【Linux】常用工具(上)

Linux 常用工具 一、Linux 软件包管理器 yum1. 软件包2. 查看软件包3. 安装/卸载软件4. yum 其他指令的功能 二、Linux 编辑器 - vim 使用1. vim 的基本概念2. vim 的基本操作&#xff08;1&#xff09;光标移动&#xff08;命令模式&#xff09;&#xff08;2&#xff09;光标…

防雷接地,综合防雷综合解决方案

雷电是一种自然现象&#xff0c;也是一种灾害。雷电对人类社会的影响是巨大的&#xff0c;不仅会造成人员伤亡和财产损失&#xff0c;还会对电力、通信、交通、石油、化工等重要行业的设备和系统造成严重的破坏。因此&#xff0c;防雷减灾是一项重要的公共安全工作。 随着科技…

C++QT day7

仿照vector手动实现自己的myVector&#xff0c;最主要实现二倍扩容功能 #include <iostream>using namespace std;template<typename T> class my_vector {int size;//可存储的容量大小int num;//当前存储的元素个数T* data;//存储数据的空间地址public://无参构造…

【开发】视频监控平台EasyCVR分组批量绑定/取消通道功能的后端代码设计逻辑介绍

视频监控平台/视频存储/视频分析平台EasyCVR基于云边端一体化管理&#xff0c;可支持视频实时监控、云端录像、云存储、磁盘阵列存储、回放与检索、智能告警、平台级联等功能。安防监控平台在线下场景中应用广泛&#xff0c;包括智慧工地、智慧工厂、智慧校园、智慧社区等等。 …

新手如何开始Microstation CE版二次开发

一步步学习MicroStation CE MDL&#xff08;C&#xff09;开发 - 技术资料库 - Bentley 中国优先社区 - Bentley Communities https://communities.bentley.com/communities/other_communities/chinafirst/w/chinawiki/57704/microstation-ce-mdl-c一步步学习MicroStation CE A…