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

【PTA数据结构 | C语言版】多叉堆的上下调整

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

    • 题目
    • 代码

题目

请编写程序,将 n 个已经满足 d 叉最小堆顺序约束的数据直接读入最小堆;随后将下一个读入的数据 x 插入堆;再执行删顶操作并输出删顶的元素;最后顺次输出堆中剩余元素以检验操作的正确性。

输入格式:
输入在第 1 行给出 2 个正整数 c(2<c≤1000)和 d(1<d≤4),依次对应最小堆的最大容量和树的度;下一行给出正整数 n(<c);随后一行按层序遍历的顺序给出 n 个最小堆元素;最后一行给出将要插入堆的元素 x。所有堆元素均为 int 型范围内的整数。

输出格式:
在一行中输出插入后再删顶的元素,格式为 min = y,其中 y 为删顶元素值。
随后 n 行,按层序遍历的顺序每行输出一个最小堆元素。

输入样例:
10 3
9
1 3 4 6 7 10 8 5 9
2

输出样例:
min = 1
2
3
4
6
7
10
8
5
9

代码

#include <stdio.h>
#include <stdlib.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}// 向上调整,维护d叉最小堆性质
void siftUp(int arr[], int n, int d, int i) {while (i > 0) {int parent = (i - 1) / d;if (arr[i] >= arr[parent]) break;swap(&arr[i], &arr[parent]);i = parent;}
}// 向下调整,维护d叉最小堆性质
void siftDown(int arr[], int n, int d, int i) {while (1) {int smallest = i;int startChild = d * i + 1;int endChild = startChild + d;for (int j = startChild; j < endChild && j < n; j++) {if (arr[j] < arr[smallest]) {smallest = j;}}if (smallest == i) break;swap(&arr[i], &arr[smallest]);i = smallest;}
}int main() {int c, d, n;scanf("%d %d", &c, &d);scanf("%d", &n);int *heap = (int *)malloc(c * sizeof(int));if (heap == NULL) {fprintf(stderr, "内存分配失败\n");return 1;}for (int i = 0; i < n; i++) {scanf("%d", &heap[i]);}int x;scanf("%d", &x);// 插入新元素heap[n] = x;siftUp(heap, n + 1, d, n);n++;// 删顶操作int min = heap[0];heap[0] = heap[n - 1];n--;siftDown(heap, n, d, 0);// 输出结果printf("min = %d\n", min);for (int i = 0; i < n; i++) {printf("%d\n", heap[i]);}return 0;
}    
http://www.dtcms.com/a/286554.html

相关文章:

  • 【LeetCode 2163. 删除元素后和的最小差值】解析
  • 上市公司-企业超额商誉数据(2005-2023年)-实证数据
  • 《C++继承深度引擎:从内存布局到多态全景拆解》​
  • 飞算科技:以创新科技引领数字化变革,旗下飞算 JavaAI 成开发利器
  • Linux Master 知识库 —— 致 Linux 系统工程师
  • 通信算法之294:LTE系统中的整数倍频偏估计
  • 太阳辐射监测站:洞察太阳能量的科技之眼
  • 【软件系统架构】系列七:系统性能——路由器性能深入解析
  • 告别宕机!Ubuntu自动重启定时任务设置(一键脚本/手动操作)
  • [Raspberry Pi]如何將無頭虛擬顯示器服務(headless display)建置在樹莓派的Ubuntu桌面作業系統中?
  • 汽车免拆诊断案例 | 07款丰田Hilux启动故障
  • Redis——MoreKey
  • 深入理解进程地址空间:虚拟内存与进程独立性
  • nodeJs笔记(六)
  • Ubuntu系统下交叉编译Android的X265库
  • 【leetcode】3202. 找出有效子序列的最大长度(2)
  • 联合利华发起TRO维权行动,OUAI商标或引发跨境圈大批量冻结
  • 密码学基础概念详解:从古典加密到现代密码体系
  • 函数指针和指针函数
  • 【非辐射复合】半导体中非辐射载流子复合的双能级机制
  • 储能BMS通信“卡壳”?CAN转EtherCAT让电池数据“跑起来”
  • animation-timing-function动画的速度曲线
  • 面试150 被围绕的区域
  • 数据结构——单调栈
  • PHP语法高级篇(三):过滤器与JSON
  • 计算机“十万个为什么”之跨域
  • STM32 RTOS 开发基础:从任务管理到同步机制的全面解析
  • 深入解析PyQt5信号与槽的高级玩法:解锁GUI开发新姿势
  • codesys【串口】
  • 搜索 #1 DFS讲解