最大堆

2018-09-01  本文已影响0人  棒棒0_0
#define HEAP_MAX 40001
#define rint register int

int heap[HEAP_MAX];
int curSize;

void heap_insert(int data)
{
    heap[++curSize] = data;
    rint pos = curSize;
    rint parent = pos >> 1;
    while (parent)
    {
        if (heap[parent] < heap[pos])
        {
            int tmp = heap[pos];
            heap[pos] = heap[parent];
            heap[parent] = tmp;
            pos = parent;
            parent = parent >> 1;
        }
        else
            break;
    }
}

bool heap_delete(int &data)
{
    if (curSize == 0)
        return false;
    data = heap[1];
    heap[1] = heap[curSize--];

    rint parent_index = 1;
    rint max_index;
    while (1)
    {
        rint left = parent_index << 1;
        rint right = left + 1;
        if (left > curSize)
            break;

        max_index = parent_index;
        if (heap[parent_index] < heap[left])
            max_index = left;
        if (right <= curSize && heap[max_index] < heap[right])
            max_index = right;

        if (max_index != parent_index)
        {
            int tmp = heap[parent_index];
            heap[parent_index] = heap[max_index];
            heap[max_index] = tmp;
            parent_index = max_index;
        }
        else
            break;
    }
}

void Init(int N, int num[])
{
    curSize = 0;
    for (rint i = 0; i < N; i++)
        heap_insert(num[i]);
}

void Push(int num)
{
    heap_insert(num);
}

int Pop()
{
    int ret = 0;
    heap_delete(ret);
    return ret;
}
上一篇 下一篇

猜你喜欢

热点阅读