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

十天学完基础数据结构-第九天(堆(Heap))

在这里插入图片描述

堆的基本概念

是一种特殊的树形数据结构,通常用于实现优先级队列。堆具有以下两个主要特点:

  1. 父节点的值始终大于或等于其子节点的值(最大堆),或者父节点的值始终小于或等于其子节点的值(最小堆)

  2. 堆是一棵完全二叉树,这意味着所有层级除了最后一层都是完全填满的,最后一层从左到右填充。

最大堆和最小堆的定义

  • 最大堆(Max Heap):在最大堆中,父节点的值始终大于或等于其子节点的值,这意味着根节点是堆中的最大元素。

  • 最小堆(Min Heap):在最小堆中,父节点的值始终小于或等于其子节点的值,这意味着根节点是堆中的最小元素。

堆的常见操作

堆支持一些常见的操作,包括:

  • 插入(Insertion):将新元素插入堆中,然后重新调整堆,以维护堆的性质。

  • 删除(Deletion):删除堆中的根节点,然后重新调整堆,以维护堆的性质。

  • 堆排序(Heap Sort):使用堆进行排序,将堆顶元素(最大或最小元素)与最后一个元素交换,然后减小堆的大小,并重新调整堆,重复此过程直到排序完成。

任务

堆在许多算法中都有广泛应用,包括Dijkstra算法、优先级队列等。掌握堆排序算法,这是一种高效的排序算法。

示例代码 - 使用C++创建最大堆和进行堆排序:

#include <iostream>
#include <vector>
#include <algorithm>class MaxHeap {
public:MaxHeap() {}// 插入元素void insert(int value) {heap.push_back(value);int index = heap.size() - 1;heapifyUp(index);}// 删除最大元素void removeMax() {if (isEmpty()) {return;}std::swap(heap[0], heap.back());heap.pop_back();heapifyDown(0);}// 堆排序void heapSort() {int n = heap.size();for (int i = n / 2 - 1; i >= 0; i--) {heapifyDown(i);}for (int i = n - 1; i > 0; i--) {std::swap(heap[0], heap[i]);heapifyDown(0, i);}}// 判断堆是否为空bool isEmpty() {return heap.empty();}private:std::vector<int> heap;void heapifyUp(int index) {while (index > 0) {int parent = (index - 1) / 2;if (heap[index] <= heap[parent]) {break;}std::swap(heap[index], heap[parent]);index = parent;}}void heapifyDown(int index, int size = -1) {if (size == -1) {size = heap.size();}while (true) {int leftChild = 2 * index + 1;int rightChild = 2 * index + 2;int largest = index;if (leftChild < size && heap[leftChild] > heap[largest]) {largest = leftChild;}if (rightChild < size && heap[rightChild] > heap[largest]) {largest = rightChild;}if (largest == index) {break;}std::swap(heap[index], heap[largest]);index = largest;}}
};int main() {MaxHeap maxHeap;maxHeap.insert(5);maxHeap.insert(10);maxHeap.insert(3);maxHeap.insert(8);maxHeap.insert(1);std::cout << "堆排序前:";for (int num : maxHeap) {std::cout << num << " ";}maxHeap.heapSort();std::cout << "\n堆排序后:";for (int num : maxHeap) {std::cout << num << " ";}return 0;
}

练习题

  1. 解释堆的基本概念中的最大堆和最小堆的定义。

  2. 描述堆排序的步骤。

  3. 为什么堆可以用于高效的优先级队列实现?

  4. 在给定的一组元素中,如何创建一个最大堆?使用C++编写相应的代码。

  5. 在给定的一组元素中,如何使用堆排序进行排序?使用C++

解释堆的基本概念中的最大堆和最小堆的定义。

  • 最大堆(Max Heap):在最大堆中,每个父节点的值都大于或等于其子节点的值。这意味着根节点包含堆中的最大元素。

  • 最小堆(Min Heap):在最小堆中,每个父节点的值都小于或等于其子节点的值。这意味着根节点包含堆中的最小元素。

描述堆排序的步骤。

堆排序是一种原地、稳定的排序算法,它的步骤如下:

  • 构建一个最大堆或最小堆,将数组视为堆。

  • 不断从堆顶(最大值或最小值)移除元素,并将其放入已排序部分的末尾。

  • 重复第二步,直到堆为空。

这个过程保证了每次移除的元素都是当前堆中的最大(最小)值,因此最终得到一个有序的数组。

为什么堆可以用于高效的优先级队列实现?

堆可以用于高效的优先级队列实现,因为堆的结构允许我们快速找到并删除最大(最小)元素,以及迅速插入新元素。这在许多算法和数据结构中都非常有用,如Dijkstra算法、Prim算法、任务调度等。堆的时间复杂度为O(log n),其中n是堆的大小,这使得优先级队列的操作非常高效。

在给定的一组元素中,如何创建一个最大堆?使用C++编写相应的代码。

创建最大堆的关键是从数组构建一个满足最大堆性质的堆。以下是使用C++创建最大堆的示例代码:

#include <iostream>
#include <vector>void maxHeapify(std::vector<int>& arr, int size, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < size && arr[left] > arr[largest]) {largest = left;}if (right < size && arr[right] > arr[largest]) {largest = right;}if (largest != i) {std::swap(arr[i], arr[largest]);maxHeapify(arr, size, largest);}
}void buildMaxHeap(std::vector<int>& arr) {int size = arr.size();for (int i = size / 2 - 1; i >= 0; i--) {maxHeapify(arr, size, i);}
}int main() {std::vector<int> arr = {4, 10, 3, 5, 1};int size = arr.size();buildMaxHeap(arr);std::cout << "最大堆:";for (int num : arr) {std::cout << num << " ";}return 0;
}

运行结果:在这里插入图片描述

在给定的一组元素中,如何使用堆排序进行排序?使用C++编写相应的代码。

堆排序的关键是将堆顶元素与数组末尾元素交换,然后减小堆的大小并重新调整堆。以下是使用C++进行堆排序的示例代码:

#include <iostream>
#include <vector>void maxHeapify(std::vector<int>& arr, int size, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < size && arr[left] > arr[largest]) {largest = left;}if (right < size && arr[right] > arr[largest]) {largest = right;}if (largest != i) {std::swap(arr[i], arr[largest]);maxHeapify(arr, size, largest);}
}void heapSort(std::vector<int>& arr) {int size = arr.size();for (int i = size / 2 - 1; i >= 0; i--) {maxHeapify(arr, size, i);}for (int i = size - 1; i > 0; i--) {std::swap(arr[0], arr[i]);maxHeapify(arr, i, 0);}
}int main() {std::vector<int> arr = {4, 10, 3, 5, 1};int size = arr.size();heapSort(arr);std::cout << "堆排序结果:";for (int num : arr) {std::cout << num << " ";}return 0;
}

运行结果:
在这里插入图片描述

相关文章:

十天学完基础数据结构-第九天(堆(Heap))

堆的基本概念 堆是一种特殊的树形数据结构&#xff0c;通常用于实现优先级队列。堆具有以下两个主要特点&#xff1a; 父节点的值始终大于或等于其子节点的值&#xff08;最大堆&#xff09;&#xff0c;或者父节点的值始终小于或等于其子节点的值&#xff08;最小堆&#xff…...

vertx的学习总结7之用kotlin 与vertx搞一个简单的http

这里我就简单的聊几句&#xff0c;如何用vertx web来搞一个web项目的 1、首先先引入几个依赖&#xff0c;这里我就用maven了&#xff0c;这个是kotlinvertx web <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apac…...

golang学习笔记(二):链路追踪

自定义http连接的服务端 package serverimport ("github.com/gin-gonic/gin""go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin""net/http" )type MyServer struct {Server *http.Server }func GetServer() *MyS…...

git提交代码实际操作

1.仓库的代码 2.克隆代码下存在的分支 git clobe https://gitee.com/sadsadasad/big-event-11.git 3.查看当下存在的分支 git branch -a 在很多情况下,我们是要围绕着dev分支进行开发,所以我们可以在开发之前问明白围绕那个分支进行开发。 4.直接拉去dev分支代码 5.如果没在…...

TF坐标变换

ROS小乌龟跟随 5.1 TF坐标变换 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 tf模块&#xff1a;在 ROS 中用于实现不同坐标系之间的点或向量的转换。 在ROS中坐标变换最初对应的是tf&#xff0c;不过在 hydro 版本开始, tf 被弃用&#xff0c;迁移到 tf2,后者更…...

如何进行网络编程和套接字操作?

网络编程是计算机编程中重要的领域之一&#xff0c;它使程序能够在网络上进行数据传输和通信。C语言是一种强大的编程语言&#xff0c;也可以用于网络编程。网络编程通常涉及套接字&#xff08;Socket&#xff09;操作&#xff0c;套接字是一种用于网络通信的抽象接口。本文将详…...

在Spark中集成和使用Hudi

本文介绍了在Spark中集成和使用Hudi的功能。使用Spark数据源API(scala和python)和Spark SQL,插入、更新、删除和查询Hudi表的代码片段。 1.安装 Hudi适用于Spark-2.4.3+和Spark 3.x版本。 1.1 Spark 3支持矩阵 Hudi...

力扣第226翻转二叉数 c++三种方法 +注释

题目 226. 翻转二叉树 简单 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&am…...

React项目部署 - Nginx配置

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…...

【Vue3】定义全局变量和全局函数

// main.ts import { createApp } from vue import App from ./App.vue const app createApp(App)// 解决 ts 报错 type Filter {format<T>(str: T): string } declare module vue {export interface ComponentCustomProperties {$filters: Filter,$myArgs: string} }a…...

【Pandas】Apply自定义行数

文章目录 1. Series的apply方法2. DataFrame的apply方法2.1 针对列使用apply2.2 针对行使用apply Pandas提供了很多数据处理的API,但当提供的API不能满足需求的时候,需要自己编写数据处理函数, 这个时候可以使用apply函数apply函数可以接收一个自定义函数, 可以将DataFrame的行…...

C#,数值计算——完全VEGAS编码的蒙特·卡洛计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Complete VEGAS Code /// adaptive/recursive Monte Carlo /// </summary> public abstract class VEGAS { const int NDMX 50; const int …...

纯css实现3D鼠标跟随倾斜

老规矩先上图 为什么今天会想起来整这个呢?这是因为和我朋友吵架, 就是关于这个效果的,就是这个 卡片懸停毛玻璃效果, 我朋友认为纯css也能写, 我则坦言他就是在放狗屁,这种跟随鼠标的3D效果要怎么可能能用纯css写, 然后吵着吵着发现,欸,好像真能用css写哦,我以前还写过这种…...

Pandas数据结构

文章目录 1. Series数据结构1.1 Series数据类型创建1.2 Series的常用属性valuesindex/keys()shapeTloc/iloc 1.3 Series的常用方法mean()max()/min()var()/std()value_counts()describe() 1.4 Series运算加/减法乘法 2. DataFrame数据结构2.1 DataFrame数据类型创建2.2 布尔索引…...

systemverilog function的一点小case

关于function的应用无论是在systemverilog还是verilog中都有很广泛的应用&#xff0c;但是一直有一个模糊的概念困扰着我&#xff0c;今天刚好有时间来搞清楚并记录下来。 关于fucntion的返回值的问题&#xff1a; function integer clog2( input logic[255:0] value);for(cl…...

微服务的初步使用

环境说明 jdk1.8 maven3.6.3 mysql8 idea2022 spring cloud2022.0.8 微服务案例的搭建 新建父工程 打开IDEA&#xff0c;File->New ->Project&#xff0c;填写Name&#xff08;工程名称&#xff09;和Location&#xff08;工程存储位置&#xff09;&#xff0c;选…...

【2023年11月第四版教材】第18章《项目绩效域》(合集篇)

第18章《项目绩效域》&#xff08;合集篇&#xff09; 1 章节内容2 干系人绩效域2.1 绩效要点2.2 执行效果检查2.3 与其他绩效域的相互作用 3 团队绩效域3.1 绩效要点3.2 与其他绩效域的相互作用3.3 执行效果检查3.4 开发方法和生命周期绩效域 4 绩效要点4.1 与其他绩效域的相互…...

Android 11.0 mt6771新增分区功能实现三

1.前言 在11.0的系统开发中,在对某些特殊模块中关于数据的存储方面等需要新增分区来保存, 所以就需要在系统分区新增分区,接下来就来实现这个功能,看系列三的实现过程 2.mt6771新增分区功能实现三的核心类 build/make/tools/releasetools/common.py device/mediatek/mt6…...

计算机网络——计算机网络的性能指标(上)-速率、带宽、吞吐量、时延

目录 速率 比特 速率 例1 带宽 带宽在模拟信号系统中的意义 带宽在计算机网络中的意义 吞吐量 时延 发送时延 传播时延 处理时延 例2 例3 速率 了解速率之前&#xff0c;先详细了解一下比特&#xff1a; 比特 计算机中数据量的单位&#xff0c;也是信息论中信…...

每日一题 518零钱兑换2(完全背包)

题目 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整…...

Linux shell编程学习笔记8:使用字符串

一、前言 字符串是大多数编程语言中最常用最有用的数据类型&#xff0c;这在Linux shell编程中也不例外。 本文讨论了Linux Shell编程中的字符串的三种定义方式的差别&#xff0c;以及字符串拼接、取字符串长度、提取字符串、查找子字符串等常用字符串操作,&#xff0c;以及反…...

【Spring笔记03】Spring依赖注入各种数据类型

这篇文章&#xff0c;详细介绍一下Spring框架中如何注入各种数据类型&#xff0c;包含&#xff1a;注入基本数据类型、数组、集合、Map映射、Property属性、注入空字符串、注入null值、注入特殊字符等内容&#xff0c;以及如何使用命名空间进行依赖注入。 目录 一、注入各种数据…...

2023计算机保研——双非上岸酒吧舞

我大概是从22年10月份开始写博客的&#xff0c;当时因为本校专业的培养方案的原因&#xff0c;课程很多&#xff0c;有些知识纸质记录很不方便&#xff0c;于是选择了打破了自己的成见使用博客来记录学习生活。对于我个人而言&#xff0c;保研生活在前一大半过程中都比较艰难&a…...

《计算机视觉中的多视图几何》笔记(13)

13 Scene planes and homographies 本章主要讲述两个摄像机和一个世界平面之间的射影几何关系。 我们假设空间有一平面 π \pi π&#xff0c;平面上的一点为 x π x_{\pi} xπ​。 x π x_{\pi} xπ​分别在两幅图像 P , P ′ P, P P,P′上形成了 x , x ′ x, x x,x′。 那…...

H5移动端购物商城系统源码 小型商城全新简洁风格全新UI 支持易支付接口

一款比较简单的 H5 移动端购物商城系统源码&#xff0c;比较适合单品商城、小型商城使用。带有易支付接口。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88391704 源码下载2&#xff1a;评论留言或私信留言...

全志ARM926 Melis2.0系统的开发指引⑤

全志ARM926 Melis2.0系统的开发指引⑤ 编写目的8. 固件修改工具(ImageModify)使用8.1.界面说明8.2.操作步骤8.2.1. 配置平台8.2.2. 选择固件8.2.3. 选择要替换的文件8.2.4. 替换文件8.2.5. 保存固件 8.3.注意事项8.4.增加固件修改权限设置8.4.1. 概述8.4.2. 操作说明8.4.2.1.打…...

【AI视野·今日Robot 机器人论文速览 第四十七期】Wed, 4 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 4 Oct 2023 Totally 40 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;基于神经网络的多模态触觉感知, classification, position, posture, and force of the grasped object多模态形象的解耦(f…...

GPX可视化工具 GPX航迹预览工具

背景 当我们收到别人分享的航迹文档&#xff0c;即gpx文档时&#xff0c;如何快速的进行浏览呢&#xff1f;我们可以使用GIS软件来打开gpx文档并显示gpx中所记录的航迹&#xff0c;例如常用的GIS软件有googleEarth&#xff0c; Basecamp&#xff0c; GPXsee&#xff0c; GPX E…...

学信息系统项目管理师第4版系列18_采购管理

1. 协议 1.1. 合同 1.1.1. 国际合作的项目经理应牢记&#xff0c;无论合同规定如何详尽&#xff0c;文化和当地法律对合同及其可执行性均有影响 1.2. 服务水平协议&#xff08;SLA&#xff09; 1.3. 谅解备忘录 1.4. 协议备忘录&#xff08;MOA&#xff09; 1.5. 订购单 …...

标准化数据模型

标准化数据模型 标准化被定义为减少或消除数据集中冗余的过程。 它已成为关系数据库中数据建模的事实上的方法&#xff0c;很大程度上是由于这些系统最初设计时所围绕的底层资源限制&#xff1a;缓慢的磁盘和昂贵的 RAM。更少的数据冗余/重复意味着更有效地从磁盘读取数据并占…...

装饰公司网站制作/网站优化关键词

1、 VALUE VALUE 函数的第一种形式返回一个大于或等于 0 且小于 1 的随机数&#xff1b;第二种形式返回一个大于或等于 LOW &#xff0c;小于 HIGH 的随机数。下面是其用法的一个示例&#xff1a; select dbms_random.value,dbms_random.value(1,5) from dual;2、 Decode 格式&…...

沧州市做网站/seo观察网

一、查看EXPDP/IMPDP的进度1 两个视图利用两个视图就可以看:DBA_DATAPUBMP_JOBS和DBA_DATAPUMP_SESSIONS视图col owner_name for a10col job_name for a20col operation for a10col job_mode for a10col state for a20col degree for a10col ATTACHED_SESSIONS for a30col DAT…...

app软件下载大全/谷歌seo查询

今天我遇到了一个需求&#xff0c;是将一个DBF文件导入到Oracle库中&#xff0c;之前一直使用的是公司提供的迁移工具&#xff0c;但是不知道怎么回事今天一直报DBF文件无法访问之类的错误&#xff0c;尝试多次之后&#xff0c;一气之下弃之不用&#xff0c;另寻他法。ODBC&…...

网站建设管理措施/广告资源对接平台

在使用NSUserDefaults的时候存入数据有时候会报以下错误: Attempt to set a non-property-list object {appkey 101021;authType 1;avatar "QnYun_pic_1476082244810-1329019310.jpg";deviceId "FC8A1F88-53F6-48F4-B5F6-B18C0B251E8F";devices "…...

web网站开发 问题解决方案/抖音指数

Linux 进程管理进程概述父子进程PID&#xff1a;进程的唯一标识号&#xff1b;systemd&#xff1a;系统启动后第一个进程&#xff0c;PID1&#xff1b;login&#xff1a;systemd进程会创建login进程&#xff0c;所以&#xff0c;systemd是login的父进程&#xff0c;反之login是…...

wordpress后台504/百度统计怎么使用

使用MATLAB两年多&#xff0c;目前每天工作必备&#xff0c;占坑&#xff0c;有时间再答&#xff01;偶尔翻翻一年以前自己写的数据处理的代码&#xff0c;真的要被自己蠢哭&#xff0c;当年真的是too young too naive。废话少说&#xff01;1. eval当处理海量数据&#xff0c;…...