//如果使用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;
}
堆和优先队列
最新推荐文章于 2023-04-15 09:53:01 发布