优先队列

在这里插入代码片
//使用堆排序 实现优先队列 ,每次选择最小的两个元素出队,让他们的和入队
#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白鼠666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值