在这里插入代码片
//使用堆排序 实现优先队列 ,每次选择最小的两个元素出队,让他们的和入队
#include<stdio.h>
#define Max 10005
#include <limits.h>
typedef int ElementType;
struct heap{
int size;
ElementType Data[Max];
};
typedef struct heap *Heap;
Heap h;
//创建堆
void Create(Heap p)
{
for(int i=(p->size)/2;i>0;i--)
AdjustDown(p,i);
}
//调整堆
void AdjustDown(Heap p,int k)
{
p->Data[0]=p->Data[k];
for(int i=2*k;i<=p->size;i*=2)
{
if(i<p->size&&p->Data[i]>p->Data[i+1])
i++;
if(p->Data[0]<=p->Data[i]) break;
else{
p->Data[k]=p->Data[i];
k=i;
}
}
p->Data[k]=p->Data[0];
}
//找最小值
ElementType HeapMin(Heap p)
{ int result=p->Data[1];
if(p->size<1)
return -1;
p->Data[1]=p->Data[p->size];
p->size-=1;
AdjustDown(p,1);//重新建立小顶堆
return result;
}
//插入元素
void Heapinsert(Heap p,int i,int key)
{
if(key>p->Data[i])
return ;
p->Data[i]=key;
while(i>0&&p->Data[i/2]>p->Data[i])
{
p->Data[i]=p->Data[i/2];
i=i/2;
}
p->Data[i]=key;
}
void HeadInsert2(Heap p,int key)
{
p->size+=1;
p->Data[p->size]=INT_MAX;
Heapinsert(p,p->size,key);
}
int main()
{
Heap p=(Heap)malloc(sizeof(struct heap));
int i,N;
scanf("%d",&N);
p->size=N;
for(i=1;i<=N;i++)
scanf("%d",&p->Data[i]);
Create(p);
ElementType a,b,sum=0;
for(i=1;i<N;i++)//注意这里是如何进行相乘的
{
a=HeapMin(p);
b=HeapMin(p);
HeadInsert2(p,a+b);
sum+=(a+b);
}
printf("%d",sum);
}
优先队列
最新推荐文章于 2024-08-05 09:40:25 发布