大顶堆是一种二叉树结构,每个节点的值都大于等于其子节点的值。可以使用数组来表示大顶堆,具体的实现如下:

#include <stdio.h>

#define MAX_HEAP_SIZE 100

int heap[MAX_HEAP_SIZE];
int heap_size = 0;

// 获取父节点的位置
int parent(int i) {
    return (i - 1) / 2;
}

// 获取左子节点的位置
int left(int i) {
    return 2 * i + 1;
}

// 获取右子节点的位置
int right(int i) {
    return 2 * i + 2;
}

// 交换两个元素的值
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 向上调整,使得堆满足大顶堆的性质
void sift_up(int i) {
    while (i > 0 && heap[i] > heap[parent(i)]) {
        swap(&heap[i], &heap[parent(i)]);
        i = parent(i);
    }
}

// 向下调整,使得堆满足大顶堆的性质
void sift_down(int i) {
    int max_index = i;
    int l = left(i);
    if (l < heap_size && heap[l] > heap[max_index]) {
        max_index = l;
    }
    int r = right(i);
    if (r < heap_size && heap[r] > heap[max_index]) {
        max_index = r;
    }
    if (i != max_index) {
        swap(&heap[i], &heap[max_index]);
        sift_down(max_index);
    }
}

// 插入一个元素
void insert(int x) {
    heap[heap_size] = x;
    heap_size++;
    sift_up(heap_size - 1);
}

// 删除最大元素
void delete_max() {
    if (heap_size == 0) {
        return;
    }
    heap[0] = heap[heap_size - 1];
    heap_size--;
    sift_down(0);
}

// 构建堆
void build_heap() {
    for (int i = parent(heap_size - 1); i >= 0; i--) {
        sift_down(i);
    }
}

int main() {
    // 输入数据
    int n;
    printf("请输入要排序的元素个数:");
    scanf("%d", &n);
    printf("请输入%d个元素:", n);
    for (int i = 0; i < n; i++) {
        int x;
        scanf("%d", &x);
        insert(x);
    }

    // 构建堆并输出排序结果
    build_heap();
    printf("排序结果为:");
    while (heap_size > 0) {
        printf("%d ", heap[0]);
        delete_max();
    }
    printf("\n");

    return 0;
}

在主函数中,首先输入要排序的元素个数和元素值,然后逐个插入到堆中。接着调用 build_heap 函数构建堆,并不断删除堆顶元素并输出,从而得到排序结果

用c语言定义一个大顶堆实现堆的插入删除操作。在主函数中输入数据构建堆然后输出排序结果。

原文地址: https://www.cveoy.top/t/topic/dIaI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录