最小堆

最小堆:所有父亲节点的值都小于儿子节点。
插入操作:首先在末尾添加元素,再不断向上(父亲节点)调整位置
删除操作:把末尾的元素值赋给根,并且删除末尾项,并且从根向下(儿子节点)不断调整位置。

最大堆与最小堆类似。操作反过来即可。

代码:

const int MAXN = 1010;

int heap[MAXN], sz = 0;

void push(int x)
{
    int i = sz++;
    while (i > 0)
    {
        //父亲节点编号
        int p = (i - 1) / 2;
        //如果当前父亲节点的值小于x
        if (heap[p] <= x)
            break;
        //不断向上交换
        heap[i] = heap[p];
        i = p;
    }
    //找到合适位置 
    heap[i] = x;
}

int pop()
{
    int ret = heap[0];
    int x = heap[--sz];

    int i = 0;
    while (i * 2 + 1 < sz)
    {
        //两个儿子节点编号
        int s1 = i * 2 + 1;
        int s2 = i * 2 + 2;
        //寻找较小的儿子节点
        if (heap[s1] > heap[s2])
            s1 = s2;
        //儿子节点值大于x
        if (heap[s1] >= x)
            break;
        //不断向下交换
        heap[i] = heap[s1];
        i = s1;
    }
    //找到合适位置
    heap[i] = x;
    return ret;
}
发布了535 篇原创文章 · 获赞 16 · 访问量 33万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览