C语言,通过一个数组,建立大根堆,输出最小值。给出注释
时间: 2024-09-09 07:17:38 浏览: 66
在C语言中,我们可以使用数组来构建一个大顶堆(最大堆),这是一种二叉树结构,其中每个节点的值都大于或等于其子节点的值。为了找到并输出堆中的最小值,即堆顶元素,我们需要按照堆的性质对数组进行调整。以下是实现这个功能的一个简单示例:
```c
#include <stdio.h> // 包含输入输出头文件
// 定义一个函数,用于交换数组中的两个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 将最后一个元素下沉,使其满足大顶堆条件
void max_heapify(int arr[], int n, int i) {
int largest = i; // 初始化最大值索引为当前节点
int left = 2 * i + 1; // 左孩子索引
int right = 2 * i + 2; // 右孩子索引
// 检查左、右子节点是否比当前节点更大
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
// 如果有较大子节点,交换并继续下沉过程
if (largest != i) {
swap(&arr[i], &arr[largest]);
max_heapify(arr, n, largest); // 递归处理下沉
}
}
// 主函数,用于读取数组并建立大顶堆
int main() {
const int size = 5; // 假设有一个包含5个元素的数组
int arr[size] = {9, 8, 7, 6, 5}; // 随意填充数组,这里是最小堆的例子
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 调整数组为大顶堆
for (int i = n / 2 - 1; i >= 0; i--) {
max_heapify(arr, n, i);
}
printf("\nMin value in the heap: %d\n", arr[0]); // 输出堆顶的最小值
return 0;
}
```
在这个例子中,`max_heapify` 函数用于维护堆的特性,而 `main` 函数首先初始化一个数组,然后调用该函数将其转换为大顶堆。最后,堆顶的最小值会被打印出来。
阅读全文