C语言创建最小堆及其操作

#include <stdio.h>
#include <stdlib.h>

// 定义最小堆结构
struct MinHeap {
    int *harr; // 指向堆数组
    int capacity; // 堆的最大容量
    int heap_size; // 当前堆的大小
};

// 用于交换两个元素
void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

// 最小堆的初始化
struct MinHeap* createMinHeap(int capacity) {
    struct MinHeap* minHeap = (struct MinHeap*) malloc(sizeof(struct MinHeap));
    minHeap->heap_size = 0;
    minHeap->capacity = capacity;
    minHeap->harr = (int *)malloc(capacity * sizeof(int));
    return minHeap;
}

// 插入操作
void insertKey(struct MinHeap* minHeap, int key) {
    if (minHeap->heap_size == minHeap->capacity) {
        printf("\n溢出: 不能插入键\n");
        return;
    }

    // 首先在堆的末尾添加新的键
    int i = minHeap->heap_size++;
    minHeap->harr[i] = key;

    // 修复最小堆的性质
    while (i != 0 && minHeap->harr[(i - 1) / 2] > minHeap->harr[i]) {
       swap(&minHeap->harr[i], &minHeap->harr[(i - 1) / 2]);
       i = (i - 1) / 2;
    }
}

// 用于将一个节点下沉到正确位置的函数
void minHeapify(struct MinHeap* minHeap, int i) {
    int l = 2 * i + 1;
    int r = 2 * i + 2;
    int smallest = i;

    if (l < minHeap->heap_size && minHeap->harr[l] < minHeap->harr[i])
        smallest = l;

    if (r < minHeap->heap_size && minHeap->harr[r] < minHeap->harr[smallest])
        smallest = r;

    if (smallest != i) {
        swap(&minHeap->harr[i], &minHeap->harr[smallest]);
        minHeapify(minHeap, smallest);
    }
}

// 建立最小堆
void buildMinHeap(struct MinHeap* minHeap) {
    int n = minHeap->heap_size - 1;
    for (int i = (n - 1) / 2; i >= 0; --i)
        minHeapify(minHeap, i);
}

// 主函数来测试上述功能
int main() {
    struct MinHeap* minHeap = createMinHeap(11);
    insertKey(minHeap, 3);
    insertKey(minHeap, 2);
    insertKey(minHeap, 1);
    insertKey(minHeap, 15);
    insertKey(minHeap, 5);
    insertKey(minHeap, 4);
    insertKey(minHeap, 45);

    buildMinHeap(minHeap);

    // 打印构建的堆
    printf("Min Heap: ");
    for (int i = 0; i < minHeap->heap_size; ++i)
        printf("%d ", minHeap->harr[i]);
    printf("\n");

    return 0;
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值