上一篇
在计算机科学中,堆是一种特殊的树形数据结构,常用于优先队列、堆排序等算法中。其中,最小堆(Min-Heap)是一种父节点的值总是小于或等于其子节点值的完全二叉树。本文将手把手教你用C语言最小堆实现一个功能完整的最小堆,即使你是编程小白也能轻松理解!

堆是一种基于完全二叉树的数据结构,分为两种:
本文聚焦于最小堆数据结构,它能快速获取当前集合中的最小元素(时间复杂度 O(1)),非常适合实现优先队列。
由于堆是一棵完全二叉树,我们可以用数组高效地存储它,无需使用指针。对于数组下标从 0 开始的情况:
我们将实现以下核心功能:
#include <stdio.h>#include <stdlib.h>#include <limits.h>// 堆的最大容量#define MAX_SIZE 100typedef struct { int data[MAX_SIZE]; int size;} MinHeap;
MinHeap* createMinHeap() { MinHeap* heap = (MinHeap*)malloc(sizeof(MinHeap)); heap->size = 0; return heap;}当新元素插入到堆底时,可能破坏堆性质,需将其与父节点比较并上浮。
void heapifyUp(MinHeap* heap, int index) { if (index == 0) return; // 根节点,无需上浮 int parentIndex = (index - 1) / 2; if (heap->data[parentIndex] > heap->data[index]) { // 交换 int temp = heap->data[parentIndex]; heap->data[parentIndex] = heap->data[index]; heap->data[index] = temp; heapifyUp(heap, parentIndex); }}
void insert(MinHeap* heap, int value) { if (heap->size >= MAX_SIZE) { printf("堆已满!\n"); return; } heap->data[heap->size] = value; heap->size++; heapifyUp(heap, heap->size - 1);}
void heapifyDown(MinHeap* heap, int index) { int left = 2 * index + 1; int right = 2 * index + 2; int smallest = index; if (left < heap->size && heap->data[left] < heap->data[smallest]) smallest = left; if (right < heap->size && heap->data[right] < heap->data[smallest]) smallest = right; if (smallest != index) { int temp = heap->data[index]; heap->data[index] = heap->data[smallest]; heap->data[smallest] = temp; heapifyDown(heap, smallest); }}
int extractMin(MinHeap* heap) { if (heap->size <= 0) { printf("堆为空!\n"); return INT_MAX; } int min = heap->data[0]; heap->data[0] = heap->data[heap->size - 1]; heap->size--; heapifyDown(heap, 0); return min;}
int main() { MinHeap* heap = createMinHeap(); insert(heap, 10); insert(heap, 5); insert(heap, 20); insert(heap, 3); insert(heap, 8); printf("依次取出最小元素:\n"); while (heap->size > 0) { printf("%d ", extractMin(heap)); } printf("\n"); free(heap); return 0;}
运行结果:
依次取出最小元素:3 5 8 10 20
通过本文,你已经掌握了如何用C语言堆操作来构建一个最小堆。这种结构是理解更高级算法(如 Dijkstra 最短路径、堆排序等)的基础。希望这篇教程能帮助你打下坚实的堆排序基础!
如果你觉得有帮助,不妨动手敲一遍代码,加深理解。编程之路,贵在实践!
本文由主机测评网于2025-12-25发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251212391.html