heap

题目描述
实现一个小根堆用以做优先队列。
给定如下数据类型的定义:

class array {
 private:
 int elem[MAXN];
 public:
 int &operator[](int i) { return elem[i]; }
};
class heap {
 private:
 int n;
 array h;
 public:
 void clear() { n = 0; }
 int top() { return h[1]; }
 int size() { return n; }
 void push(int);
 void pop();
};

要求实现:

void heap::push(int x) {
 // your code
}
void heap::pop() {
 // your code
}

测试样例
test code

heap h;
h.push(3);
h.push(1);
h.push(2);
printf("%d\n", h.top());
h.pop();
printf("%d\n", h.top());

test output

1
2

提示
只提交heap::push和heap::pop,注意堆顶元素的下标是1而不是0。
Yizuodi的答案
参考:小根堆(Heap)的详细实现

#include <iostream>
#include <heap.h>
using namespace std;

void heap::push(int x)
{
    ++n;//heap size+1
    h[n] = x;
    int p = n / 2, t = n;
    while (p >= 1)
    {
        if (h[p] <= h[t])
        {
            break;
        }
        swap(h[p], h[t]);
        t = p;
        p = p / 2;
    }
}

void heap::pop()
{
    h[1] = h[n];
    --n;//heap size-1
    int p = 1;//p position
    while (1)
    {
        if (2 * p > n)
            break;
        if (2 * p == n && h[p] <= h[n])
            break;
        if (2 * p < n && h[p] <= h[p * 2] && h[p] <= h[p * 2 + 1])
            break;
        if (2 * p == n && h[p] > h[n])
        {
            swap(h[n], h[p]);
            break;
        }
        else
        {
            if (h[p * 2] < h[p * 2 + 1])
            {
                swap(h[p], h[p * 2]);
                p = p * 2;
            }
            else
            {
                swap(h[p], h[p * 2 + 1]);
                p = p * 2 + 1;
            }
        }
    }
}
上一篇: Query 下一篇: Permutation Generation
支持 makedown语法