【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

代码

cpp 复制代码
#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;
}    
相关推荐
Jul1en_5 分钟前
【算法】分治-归并类题目
java·算法·leetcode·排序算法
kangk126 分钟前
统计学基础之概率(生物信息方向)
人工智能·算法·机器学习
再__努力1点6 分钟前
【77】积分图像:快速计算矩形区域和核心逻辑
开发语言·图像处理·人工智能·python·算法·计算机视觉
唯唯qwe-20 分钟前
Day22: 贪心算法 | 区间问题,左/右端点排序
算法·贪心算法
Hcoco_me32 分钟前
LLM(Large Language Model)系统学习路线清单
人工智能·算法·自然语言处理·数据挖掘·聚类
java修仙传38 分钟前
力扣hot100:寻找旋转排序数组中的最小值
算法·leetcode·职场和发展
胖咕噜的稞达鸭43 分钟前
算法日记专题:位运算II( 只出现一次的数字I II III 面试题:消失的两个数字 比特位计数)
c++·算法·动态规划
fantasy_arch43 分钟前
pd_process.c 文件源码分析
c语言·数据库·视频编解码·av1
txzrxz1 小时前
图的存储
算法·深度优先·图论
Knight_AL1 小时前
深入解析 JVM 垃圾回收算法:经典 vs 新型 GC 算法
jvm·算法