堆的模拟实现(详解)c++

server/2025/2/2 8:26:30/

 根据前两篇文章(向上调整算法以及向下调整算法),堆的实现就变得巨简单了。 

1 创建 
创建⼀个⾜够⼤的数组充当堆; 
创建⼀个变量 n,⽤来标记堆中元素的个数

const int N = 1e6 + 10;
int n;
int heap[N];

2 插⼊ 
把新来的元素放在最后⼀个位置,然后从最后⼀个位置开始执⾏⼀次向上调整算法即可。

void push(int x)
{heap[++n] = x;up(n);
}

                           

时间复杂度: 
时间开销在向上调整算法上,时间复杂度为 O(log N) 。

3 删除栈顶元素 
将栈顶元素和最后⼀个元素交换,然后 n--,删除最后⼀个元素; 
从根节点开始执⾏⼀次向下调整算法即可

void pop()
{swap(heap[1], heap[n]);--n;down(1);
}

                

时间复杂度: 
时间开销在向上调整算法上,时间复杂度为 O(log N) 。

4 堆顶元素 
下标为 1 位置的元素,就是堆顶元素

int top() { return heap[1]; }

时间复杂度: 
显然是 O(1) 。

5 堆的⼤⼩ 
n 的值。

int size() { return n; }

时间复杂度: 
显然是 O(1) 。

全部代码实现:

#include <iostream>
using namespace std;const int N = 1e6 + 10;
int n;
int heap[N];//向上调整算法
void up(int child) //每次和父亲做比较
{int parent = child / 2;//父节点存在且当前结点值大于父节点的权值while (parent >= 1 && heap[child] > heap[parent]){swap(heap[child], heap[parent]);child = parent;parent = child / 2;}
}// 向下调整算法
void down(int parent)//拿当前结点和孩子作比较
{int child = parent * 2;//当孩子存在指向向下调整算法while (child <= n) //左孩子都不存在,右孩子一定不存在{//找最大的孩子//存在右孩子并且右孩子大于左孩子,条件满足指向最大的孩子,否则不作为if (child + 1 <= n && heap[child + 1] > heap[child]) child++;if (heap[parent] >= heap[child]) return; //如果父节点大于孩子节点就不用调整了swap(heap[parent], heap[child]); //交换父子节点parent = child; //父节点向下走child = parent * 2; //孩子向下走}
}// 插入元素
void push(int x)
{heap[++n] = x;up(n);
}// 删除堆顶元素
void pop()
{swap(heap[1], heap[n]);--n;down(1);
}// 查询堆顶元素
int top() { return heap[1]; }
// 堆的大小
int size() { return n; }int main()
{//测试堆int a[10] = { 1, 41, 23, 10, 11, 2, -1, 99, 14, 0 };//将这10个数依次放入堆中for (int i = 0; i < 10; ++i){push(a[i]);}//输出降序while (size()){cout << top() << " ";pop();}return 0;
}
  • 在大根堆中,每次拿出的堆顶元素都是最大的,删完之后再拿出的堆顶元素是次大的,所以输出的结果是一个降序的结果

http://www.ppmy.cn/server/164282.html

相关文章

如何编写地信测绘信息相关的综述论文-总结版本

A. Hamissi, A. Dhraief, and L. Sliman, “A Comprehensive Survey on Conflict Detection and Resolution in Unmanned Aircraft System Traffic Management,” IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS, 2024 DEC 10, 2024. 摘要 痛点&#xff1a;Severa…

蓝桥杯python语言基础(1)——编程基础

目录 一、python开发环境 二、python输入输出 &#xff08;1&#xff09;print输出函数 print(*object&#xff0c;sep,end\n,......) &#xff08;2&#xff09;input输入函数 input([prompt]), 输入的变量均为str字符串类型&#xff01; input()会读入一整行的信息 ​编…

50. 正点原子官方系统镜像烧写实验

一、Windows下使用OTG烧写系统 1、在Windos使用NXP提供的mfgtool来向开发烧写系统。需要用先将开发板的USB_OTG接口连接到电脑上。 Mfgtool工具是向板子先下载一个Linux系统&#xff0c;然后通过这个系统来完成烧写工作。 切记&#xff01;使用OTG烧写的时候要先把SD卡拔出来&…

http跳转https

1、第一种&#xff1a;不好使 在nginx的配置中&#xff0c;在https的server站点添加如下头部&#xff1a; add_header Strict-Transport-Security “max-age63072000; includeSubdomains; preload”; 这样当第一次以https方式访问我的网站&#xff0c;nginx则会告知客户端的浏览…

C++中常用的十大排序方法之1——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的相关…

在AWS上使用KMS客户端密钥加密S3文件,同时支持PySpark读写和Snowflake导入

现有AWS EMR集群上运行PySpark代码&#xff0c;可以读写S3上的数据文件&#xff0c;Snowflake数据仓库也需要导入S3上的文件到表。现在要用AWS KMS有客户端密钥加密S3上的文件&#xff0c;同时允许PySpark代码&#xff0c;可以读写S3上的数据文件&#xff0c;Snowflake数据仓库…

Vue3的el-table-column增加跳转其他页面

效果图 既不影响显示内容&#xff0c;也不影响页面跳转 el-table-column写法 <el-table-columnlabel"系统单号"align"center"prop"systematicReceipt"width"180" ><template #default"scope"><el-link t…

论文阅读(三):微阵列数据的图形模型和多变量分析

1.论文链接&#xff1a;Graphical Models and Multivariate Analysis of Microarray Data 摘要&#xff1a; 基因表达数据的通常分析忽略了基因表达值之间的相关性。从生物学上讲&#xff0c;这种假设是不合理的。本章介绍的方法允许通过稀疏高斯图形模型来描述基因之间的相关…