手写最小堆

下面是一个完整的C++实现手写最小堆的代码。最小堆是一种完全二叉树,其中每个节点的值都小于或等于其子节点的值。

参考代码

#include <iostream>
#include <vector>
#include <stdexcept>

class MinHeap {
private:
    std::vector<int> heap;

    // 获取父节点索引
    int parent(int i) {
        return (i - 1) / 2;
    }

    // 获取左子节点索引
    int leftChild(int i) {
        return 2 * i + 1;
    }

    // 获取右子节点索引
    int rightChild(int i) {
        return 2 * i + 2;
    }

    // 上浮操作
    void heapifyUp(int i) {
        while (i > 0 && heap[parent(i)] > heap[i]) {
            std::swap(heap[parent(i)], heap[i]);
            i = parent(i);
        }
    }

    // 下沉操作
    void heapifyDown(int i) {
        int minIndex = i;
        int left = leftChild(i);
        int right = rightChild(i);

        if (left < heap.size() && heap[left] < heap[minIndex]) {
            minIndex = left;
        }

        if (right < heap.size() && heap[right] < heap[minIndex]) {
            minIndex = right;
        }

        if (i != minIndex) {
            std::swap(heap[i], heap[minIndex]);
            heapifyDown(minIndex);
        }
    }

public:
    // 插入元素
    void insert(int value) {
        heap.push_back(value);
        heapifyUp(heap.size() - 1);
    }

    // 获取最小元素
    int getMin() {
        if (heap.empty()) {
            throw std::out_of_range("Heap is empty");
        }
        return heap[0];
    }

    // 删除最小元素
    void extractMin() {
        if (heap.empty()) {
            throw std::out_of_range("Heap is empty");
        }
        heap[0] = heap.back();
        heap.pop_back();
        heapifyDown(0);
    }

    // 打印堆
    void print() {
        for (int i : heap) {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    }
};

int main() {
    MinHeap minHeap;

    minHeap.insert(10);
    minHeap.insert(5);
    minHeap.insert(15);
    minHeap.insert(2);
    minHeap.insert(20);

    std::cout << "Min heap: ";
    minHeap.print();

    std::cout << "Min element: " << minHeap.getMin() << std::endl;

    minHeap.extractMin();
    std::cout << "Min heap after extractMin: ";
    minHeap.print();

    return 0;
}

代码说明:

堆的存储:使用std::vector来存储堆中的元素。

辅助函数:

parent(int i):获取索引i的父节点索引。

leftChild(int i):获取索引i的左子节点索引。

rightChild(int i):获取索引i的右子节点索引。

上浮操作:heapifyUp(int i)用于在插入新元素后,将元素上浮到正确的位置,以维护堆的性质。

下沉操作:heapifyDown(int i)用于在删除最小元素后,将新的根元素下沉到正确的位置,以维护堆的性质。

插入操作:insert(int value)将新元素插入堆中,并调用heapifyUp维护堆的性质。

获取最小元素:getMin()返回堆中的最小元素(即根节点)。

删除最小元素:extractMin()删除堆中的最小元素,并调用heapifyDown维护堆的性质。

打印堆:print()函数用于打印堆中的所有元素。

输出结果

Min heap: 2 5 15 10 20 
Min element: 2
Min heap after extractMin: 5 10 15 20 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值