优先队列

优先队列学习笔记

思想改变世界,技术连接你我。果果,今天过得好吗? —Joly Zhang

基于大根堆的最大堆,支持的操作有:
INSERT(S, x):把元素x插入到集合S中。
MAXIMUM(S):返回S中具有最大关键字的元素。
EXTRACT-MAX(S):去掉并返回S中具有最大关键字的元素。
INCREASE-KEY(S, x, k):将元素x的关键字增加到k,这里的k值不能小于x的原来关键字的值。
#define MAX_INT ((unsigned)(-1)>>1)
#define MIN_INT (~MAX_INT)

/**
基于大根堆的最大优先队列
            --Joly Zhang 
            date:09/21/2016
**/

int heap_maximum(int A[])
{
    return A[1];
}

/*
功能:抽取有最大键值的元素。
原理:
    step1:记录根节点的为最大元素。
    step2:用最后一个元素覆盖根节点。
    step3:调整大根堆。
*/
int heap_extract_max(int A[], int *heap_size)
{   
    if (*heap_size < 1)
    {
        throw"heap underflow";
    }
    int max = A[1];

    A[1] = A[*heap_size];
    --(*heap_size);

    max_heapify(A, *heap_size, 1);

    return max;

}

/*
    功能:增大元素i的键值到key。
    原理:
        step1:用key替换i元素的键值。
        step2:使键值key沿路径上升,直至找到合适的位置
*/
void heap_increase_key(int A[], int heap_size, int i, int key)
{
    if (key < A[i])
    {
        throw"new key is smaller than current key";
    }

    A[i] = key;
    while (i > 1 && A[i] > A[PARENT(i)])
    {
        int temp = A[i];
        A[i] = A[PARENT(i)];
        A[PARENT(i)] = temp;

        i = PARENT(i);
    }

}

/*
    功能:向最大优先队列中差入一个元素
    原理:
        step1:先在最后增加一个键值为MIN_INT的元素。
        step2:将该元素的键值增加至key。
*/
void max_heap_insert(int A[], int * heap_size, int key)
{
    if (*heap_size == MAX_SIZE)
    {
        throw"heap overflow";
    }
    ++(*heap_size);
    A[*heap_size] = MIN_INT;
    heap_increase_key(A, *heap_size, *heap_size, key);
}

后续将分享二项堆和斐波那契堆的学习笔记,敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值