首页 > 其他分享 >一维数组模拟堆

一维数组模拟堆

时间:2023-11-28 22:58:56浏览次数:35  
标签:一维 结点 数组 int up down heap 模拟 size

1.

 1 /如何手写一个堆?完全二叉树 5个操作
 2 //1. 插入一个数         heap[ ++ size] = x; up(size);
 3 //2. 求集合中的最小值   heap[1]
 4 //3. 删除最小值         heap[1] = heap[size]; size -- ;down(1);
 5 //4. 删除任意一个元素   heap[k] = heap[size]; size -- ;up(k); down(k);
 6 //5. 修改任意一个元素   heap[k] = x; up(k); down(k);
 7 #include <iostream>
 8 
 9 using namespace std;
10 
11 int const N = 100010;
12 
13 //h[i] 表示第i个结点存储的值,i从1开始,2*i是左子节点,2*i + 1是右子节点
14 //size 既表示堆里存储的元素个数,又表示最后一个结点的下标
15 int h[N], siz; //堆有两个变量h[N],size; 怎么这里的size和文件里有冲突,只能改成siz了
16 
17 void down(int u)
18 {
19     int t = u;//t存储三个结点中存在的最小的结点的下标,初始化为当前结点u
20     if (u * 2 <= siz && h[u * 2] < h[t]) t = u * 2; // 左子节点存在并且小于当前结点,更新t的下标
21     if (u * 2 + 1 <= siz && h[u * 2 + 1] < h[t]) t = u * 2 + 1;//右子节点存在并且小于当前结点,更新t的下标
22     if (t != u)//如果t==u意味着不用变动,u就是三个结点中拥有最小值的结点下标,否则交换数值
23     {
24         swap(h[t], h[u]);
25         down(t); //交换数值后,t这个结点存储原本u的值,u存储存储t的值(三个数中的最小值)。u不用调整了,但t情况不明,可能需要调整。直到它比左右子节点都小
26     }
27 }
28 
29 int main()
30 {
31     int n, m;
32     cin >> n >> m;
33     for (int i = 1; i <= n; i ++ ) scanf("%d", &h[i]); 
34     siz = n; //初始化size,表示堆里有n 个元素
35 
36     for (int i = n / 2; i; i --) down(i); //把堆初始化成小根堆,从二叉树的倒数第二行开始,把数字大的下沉
37 
38     while (m -- )
39     {
40         printf("%d ", h[1]);
41         h[1] = h[siz];
42         siz --;
43         down(1);
44     }
45 
46     return 0;
47 }
View Code

 

标签:一维,结点,数组,int,up,down,heap,模拟,size
From: https://www.cnblogs.com/rw666/p/17863323.html

相关文章

  • (查找)02-二维数组中的查找
    1importjava.util.*;23publicclassSolution{4/**5*@paramtargetint整型6*@paramarrayint整型二维数组7*@returnbool布尔型8*/9publicbooleanFind(inttarget,int[][]array){10//判空矩阵1......
  • 数组(3)二维数组
    <1>二维数组的基本内容(1)基本了解举例:inta[3][5];概念:可以将a理解为一个三行五列的矩阵;(由此证明3代表行,5代表列)(2)二维数组的遍历代码:for(i=0;i<3;i++){for(j=0;j<5;j++){a[i][j]=i*j;}}a[i][j]是一个int;表示第i行和第j列上的单元;提出问题:a[i,j]表示的含......
  • 模拟体育竞技分析:乒乓球比赛规则
     要求:1)模拟体育竞技分析:(不同学号选做不同题目,必做题)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬......
  • 数组(2)数组运算及典例(求解素数的方法)
    <1>数组运算1)数组的集成初始化1.形式示例1-inta[]={1,2,3...};2-inta[13]={2};————第一个单元内中的a0=2,剩下的单元都默认赋为0;2.集成初始化时的定位——仅适用于C99举例:inta[10]={[0]=2,[2]=3,6,};特点:用[n]在初始化数据中给出定位;没有定位的数......
  • 自学day7 数组
    typora-copy-images-to:media数组一、概念对象中可以通过键值对存储多个数据,且数据的类型是没有限制的,所以通常会存储一个商品的信息或一个人的信息:varobj={goodsname:"手机",price:"5000",introduce:"手机很时尚,很漂亮!"}varperson={name:"张......
  • 20231126模拟赛
    2023.11.26模拟赛T1给定数列\(a_{1,\cdots,n},b_{1,\cdots,m}\),一个\(n\timesm\)的矩阵\(W\)满足\(W_{i,j}=a_i+b_j\)。给定常数\(x\),问满足\(W_{i,j}\lex\)的所有格子\((i,j)\)形成的四连通块数量。\(1\len,m,x,a_i,b_j\le2\times10......
  • 数字域dB到模拟域dBm的换算
    Vrms、Vpk、W、dBm、dBW、dBuV、dBm/HzdBm的定义在通信工程中,功率的大小通常用是用dBm值来表示的,是一个对数度量,被定义为相对于1mW参考功率电平的分贝,即dBm代表每毫瓦分贝。因此,它是一个无量纲单位,实际上指定了功率比而不是功率。它的计算公式如下:dBm=10*log(P/1mW)其中P......
  • 解决AndroidStudio 模拟器无网络连接
    解决AndroidStudio模拟器无网络连接主要原因是安卓模拟器的dns和电脑的dns不一致引起的,可以修改安卓模拟器的dns即可找到安卓模拟器的名字修改安卓模拟器dns命令 #Pixel7_API_30_fei这个是你自己模拟器的名字,也就是第一步中找的的模拟器名字./emulator-avdPixel......
  • [LettCode] 找到数组中和为目标值的两个数
    给定一个整数数组intArr, 还有一个目标值targetValue,需要在这个数组intArr中找出和为目标值targetValue的两个整数,并返回它们的数组下标example:intArr=[2,7,11,15],target=9,显然两个值是2和7,它们的数组下标为0,1 ......
  • Java 将JSON数组转成List对象集合
     一、从对象列表中提取并组装JSON字段的数据:(工具类)publicclassJsonMsgUtils<T>{/***从对象列表中提取并组装JSON字段的数据。**@paramlogs包含对象的列表*@paramtargetClass目标对象类型,表示JSON消息的结构......