C语言实现堆
2023-12-23 23:30:36
C语言实现堆
在 C 语言中,实现一个堆通常涉及使用动态内存分配来存储和管理数据。以下是一个简化的步骤和概念,以实现一个最小的堆结构:
1. 数据结构定义
首先,你需要定义堆节点和堆的数据结构。这里,我们将实现一个最小堆。
typedef struct {
int *array; // 存储堆数据的数组
int capacity; // 堆的最大容量
int size; // 堆的当前大小
} MinHeap;
2. 基本操作
2.1 初始化堆
MinHeap* createMinHeap(int capacity) {
MinHeap* heap = (MinHeap*) malloc(sizeof(MinHeap));
heap->capacity = capacity;
heap->size = 0;
heap->array = (int*) malloc(capacity * sizeof(int));
return heap;
}
2.2 堆化
堆化是将一个数组转换为堆的过程。这里我们实现一个最小堆。
void minHeapify(MinHeap* heap, int idx) {
int smallest = idx;
int left = 2 * idx + 1;
int right = 2 * idx + 2;
if (left < heap->size && heap->array[left] < heap->array[smallest])
smallest = left;
if (right < heap->size && heap->array[right] < heap->array[smallest])
smallest = right;
if (smallest != idx) {
// 交换元素
int temp = heap->array[idx];
heap->array[idx] = heap->array[smallest];
heap->array[smallest] = temp;
// 递归地堆化
minHeapify(heap, smallest);
}
}
2.3 插入元素
在最小堆中插入一个元素:
void insertKey(MinHeap* heap, int key) {
if (heap->size == heap->capacity) {
printf("\nOverflow: Could not insertKey\n");
return;
}
// 插入元素到最后一个位置
int i = heap->size;
heap->size++;
heap->array[i] = key;
// 保持堆的性质
while (i != 0 && heap->array[(i - 1) / 2] > heap->array[i]) {
// 交换当前节点和其父节点的值
int temp = heap->array[(i - 1) / 2];
heap->array[(i - 1) / 2] = heap->array[i];
heap->array[i] = temp;
// 移到父节点
i = (i - 1) / 2;
}
}
2.4 提取最小值
从最小堆中提取最小值:
int extractMin(MinHeap* heap) {
if (heap->size <= 0)
return INT_MAX;
if (heap->size == 1) {
heap->size--;
return heap->array[0];
}
// 保存最小值
int root = heap->array[0];
// 将最后一个元素移到根位置
heap->array[0] = heap->array[heap->size - 1];
heap->size--;
// 堆化根
minHeapify(heap, 0);
return root;
}
3. 销毁堆
记得在不再使用堆时释放内存:
void destroyHeap(MinHeap* heap) {
free(heap->array);
free(heap);
}
这只是一个非常基础和简化的堆实现。在实际应用中,你可能需要考虑更多的细节和优化,例如动态调整容量、添加更多的堆操作等。
文章来源:https://blog.csdn.net/StoryZX/article/details/135175882
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!