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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。