堆和优先队列

//如果使用vector代替array,可以动态改变大小,就不需要struct HeapStruct;
template<typename ElementType>
struct HeapStruct{
    int Capacity;  //数组所能存放元素的最大个数
    int Size;  //当前有限队列的大小
    ElementType *Elements;  //存放元素的数组
}

typedef struct HeapStruct* PriorityQueue;

PriorityQueue Initialize(int MaxElements /*数组的大小*/){

    PriorityQueue H;
    //if(MaxElements<MinPQSize)
    H=malloc(sizeof(struct HeapStruct));
    if(H==NULL)
        FatalError("out of space!");

    H->Elements=malloc((MaxElements+1)*sizeof(ElementType));
    if(H->Elements==NULL)
        FatalError("out of space!");

    H->Capacity=MaxElements;
    H->Size=0;
    H->Elements[0]=MinData;

    return H;
}

//add an element into priority_queue;
void Insert(ElementType x,PriorityQueue H){
    // if(H==NULL)
    // {
        // Error("H is not exist")
    // }

    if(IsFull(H))
    {
        Error("priority queue is full!");
        return;
    }

    int i;
    for(i=++H->Size;H->Elements[i/2]>x;i/=2)
    {
        H->Elements[i]=H->Elements[i/2];
        //H->Elements[i/2]=H->Elements[i];
    }
    H->Elements[i]=x;
}

//delete the min element from priority queue
ElementType DeleteMin(PriorityQueue H){
    if(IsEmpty(H))
    {
        error("the priority is empty!");
        return H->Elements[0];  //#0元素保留
    }

    ElementType MinElement,LastElement;
    MinElement=H->Elements[1];
    LastElement=H->Elements[H->Size--];

    int i,child;
    for(i=1;i<H->Size;i*=2;)
    {
        //find smaller child
        child=i*2;
        if(child!=H->Size && H->Elements[child+1] < H->Elements[child] )
        {
            child++;
        }

        //percolate one level
        if(LastElement > H->Elements[child])
            H->Elements[i]=H->Elements[child];
        else
            break;
    }

    H->Elements[i]=LastElement;
    return MinElement;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值