ACM 优先队列和堆

来源:互联网 发布:淘宝官网电脑版 编辑:程序博客网 时间:2024/06/05 03:54
//heapint sz = 0;int heap[maxn];void push(int x){    int i = sz++;    int p;    while(i > 0){        p = (i - 1) / 2;//父亲节点编号        if(heap[p] <= x) break;//如果已经没有大小颠倒则退出        heap[i] = heap[p];//把父亲节点的数值放下来, 而把自己提上去        i = p;    }    heap[i] = x;}int pop(){    int _min = heap[0];//最小值    int last = heap[--sz];//提到根的值    int i = 0;    int a, b;    while(i*2+1 < sz){        a = i * 2 + 1; b = i * 2 + 2;//比较儿子的值        if(b < sz && heap[b] < heap[a]) a = b;        if(last <= heap[a]) break;//如果已经没有大小颠倒则退出        heap[i] = heap[a];//把儿子的数值提上来        i = a;    }    heap[i] = last;    return _min;}
原创粉丝点击