#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;
}