首页 > 其他分享 >堆-- 神奇的优先队列

堆-- 神奇的优先队列

时间:2023-02-17 15:05:49浏览次数:399  
标签:return -- void 队列 int 编号 节点 神奇


堆是什么?是一种特殊的完全二叉树,就像树一样。

堆-- 神奇的优先队列_父节点

有没有发现这棵二叉树有一个特点?就是所有的父节点都比子节点小(PS :就是圆圈的数值,圆圈外面的编号是这个节点的编号,)那么符合这样特点的我们称之为最小堆。

#include <iostream>
#include <cstdio>
using namespace std ;
const int MAX = 1000 ;
const int INF = 0x3f3f3f3f ;


int n , m ;
// 堆 -- 神奇的优先队列;
int h[MAX];
// 交换函数,用来交换堆中两个元素的值;
void swap(int x ,int y)
{
int t ;
t = h[x] ;
h[x] = h[y] ;
h[y] = t ;
return ;
}
// 向下调整函数;
void siftdown(int i)
{
int t ,flag =0 ; // flag 用来标记是否需要向下调整
// 当i有子节点的时候,并且需要调整的时候循环就执行;

while( i*2 <=n && flag==0)
{
// 首先判断i即父节点与左儿子的关系,并用t来记录值较小的结点编号

if(h[i]>h[i*2])
t = i*2;
else
t =i ;

if(i*2+1 <=n )
{
//已经和左儿子进行过比较了,再和右儿子比较;
if(h[t] > h[i*2+1])
t = i*2+1 ;

}
// 如果发现最小的节点编号不是自己,说明子节点中有比
// 父节点还小的,就要交换值;
if(t!=i)
{
swap(t,i);
i =t ; // 更新i为刚才与他交换的儿子节点的编号,便于接下来继续向下调整

}
else
flag = 1 ; // 说明父节点的值比 子节点的值都要小 ;


}
return ;
}
// 建立堆函数;
void creat()
{
int i ;
for(i=n/2 ;i>=1 ;i--)
{
siftdown(i) ;
}
return ;

}
// 删除最大元素;
int deletemax()
{
int t ;
t = h[1] ; // 用一个临时变量t 来记录堆顶的值;
h[1] =h[n] ; // 将堆的最后一个点复制到堆顶
n-- ;// 对的元素减少;
siftdown(1);
return t ;

}
int main()
{

int i , num ;
cin >>num ;
for(i=1;i<=num ;i++)
{
cin>>h[i] ;
}
n = num ;
creat();
for(i=1;i<=num ;i++)
{
printf("%d ",deletemax());
}

return 0 ;
}


标签:return,--,void,队列,int,编号,节点,神奇
From: https://blog.51cto.com/u_15970235/6064102

相关文章

  • 贪心-活动选择
    题目描述: ProblemDescription学校的大学生艺术中心周日将面向全校各个学院的学生社团开放,但活动中心同时只能供一个社团活动使用,并且每一个社团活动开始后都不能中断。现......
  • 基于sysbench-mongodb-lua的mongodb的性能测试
    1.环境准备installsysbenchyuminstallsysbenchinstallmongoroverdriver···yuminstalllibmongoc-devlibbson-devluarocksluarocksinstallmongorover......
  • 素数的埃式筛选法
    constintN=1e7;intprime[N];//第i个素数boolis_prime[N];intsieve(intn){intcnt=0;for(inti=0;i<=n+1;i++){is_prime[i]=true;}is_p......
  • 只有五行的算法----Floyd-Warshall
    上图为一个城市地图,图中有4个城市,8条公路,公路上的数字表示这条公路的长短,并且这些公路是单向的,我们现在要求出任意两个城市之间的最短路径,也就是求任意两点的最短路径。我......
  • 数据结构--顺序线性表
    #include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>usingnamespacestd;#defineOK1#defineERROR-1#defineLIST_INIT_SIZE100#defineLISTSIZ......
  • 数据结构--基本概念及术语
    1. 数据:是对客观事物的符号表示,在我们计算机科学中是指所有能输入到计算机中,并能够被计算机程序处理的符号总称。他是计算机程序加工的“原料”。比如说,一个利用数值分......
  • 数据结构--线性表
    线性表最简单也是最常用的一种数据结构,它的特点是,在数据元素的非空有限集中,(1)存在唯一一个被称为“第一个”的数据元素,存在唯一一个被称为“最后一个”的数据元素。(2)除了第......
  • 《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第十三章 QSPI Flash读写测试实验​
    QSPIFlash读写测试实验​PS的输入/输出外设(IOP)有两个具有不同功能特性和IO接口性能的QSPI控制器。它们共享相同的APB从接口和MIO引脚。一次只能使用控制器中的一个。QSPI......
  • 负载均衡意思
    什么事负载均衡?将用户请求或者说流量通过负载均衡器,按照某种负载均衡算法把流量均匀地分散到后端的多个服务器上,接收到请求的服务器可以独立的响应请求,以期望的规则分摊到多......
  • 我的两群吃粽小伙子
    3270:我的两群吃粽小伙伴TimeLimit:1Sec  MemoryLimit:128MBSubmit:683  Solved:26[​​Submit​​][​​Status​​][​​WebBoard​​]Description......