_04-堆的插入和删除

该博客介绍了小顶堆的初始化、插入、获取堆头元素、弹出堆顶及内容打印的实现过程。堆是一种特殊的树形数据结构,常用于优先队列。在这个实例中,0号位置用作守卫,不存储有效数据,所有元素从1号位置开始。源码展示了如何在C++中创建和操作小顶堆,包括插入元素时的下沉操作以及弹出最小元素时的调整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

本题要求完成堆的初始化、插入、堆头元素的获取、堆的弹出和堆内容的打印。

本题的堆是小顶堆,也就是每次弹出的都是最小的那个元素。同时0号位是一个值为-1的守卫,0号位不使用,所有元素从1号位开始放置

思路:

①创建堆。包括其数值、当前容量和最大容量。

②堆的插入。若插入值比最后一个节点的下一个节点i的父节点i/2的值小,则将父节点值赋给i(第一次这个i的节点是空的,第二次这个节点已经赋值给其儿子节点),i/=2。循环至插入值比i/2的值大,则将插入值赋给i。

③堆的弹出。因为堆的数值类型定义为int*,所以直接返回数组下标为1的值即可。

源码:

//struct HEAP{
//    int* data;
//    int reserved_size;
//    int cur_size;
//    HEAP(int size);
//    void push( int value );
//    int top() const;
//    void pop();
//    void show_content() const;
//};

HEAP::HEAP(int size) {
    reserved_size = size;
    data = new int[size];
    cur_size = 0;
    data[0] = -1;
}

void HEAP::push(int value) {
    int i = 0;
    i = ++cur_size;
    for (; data[i / 2] > value; i /= 2)
        data[i] = data[i / 2];
    data[i] = value;
}

int HEAP::top() const {
    return data[1];
}

void HEAP::pop() {
    int parent = 0, child = 0, t = 0;
    t = data[cur_size--];
    for (parent = 1; parent * 2 <= cur_size; parent = child) {
        child = parent * 2;
        if ((child != cur_size) && data[child] > data[child + 1])
            child++;
        if (t <= data[child])break;
        else
            data[parent] = data[child];
    }
    data[parent] = t;
}

void HEAP::show_content() const {
    for (int i = 0; i <= cur_size; i++)
        cout << data[i] << " ";
    cout << endl;
}

ps:无

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别搜了,自己做

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值