#include<stdio.h>
#include<stdlib.h>
typedef struct HNode * Heap;
struct HNode
{
int * Data;
int Size;
int Capacity;
};
typedef Heap MinHeap;
//最小堆的创建
#define MINDATA -1
MinHeap CreateHeap(int MaxSize)
{
MinHeap H = (MinHeap)malloc(sizeof(struct HNode));
H->Data = (int *)malloc ((MaxSize+1)*sizeof(int));
H->Size=0;
H->Capacity=MaxSize;
H->Data[0]=MINDATA;
return H;
}
//最小堆的插入
bool IsFull(MinHeap H)
{
return (H->Size==H->Capacity);
}
bool Insert(MinHeap H,int X)
{
int i;
if(IsFull(H))
{
return false;
}
i=++H->Size;
for(; H->Data[i/2]>X; i/=2)
{
H->Data[i]=H->Data[i/2];
}
H->Data[i]=X;
return true;
}
//最小堆的删除
#define ERROR -1
bool IsEmpty(MinHeap H)
{
return (H->Size==0);
}
void DeleteMin(MinHeap H)
{
int Parent,Child;
int MaxItem,X;
if(IsEmpty(H))
{
return;
}
X=H->Data[H->Size--];
for(Parent=1; Parent*2<=H->Size; Parent=Child)
{
Child=Parent*2;
if((Child!=H->Size)&&(H->Data[Child]>H->Data[Child+1]))
Child++;
if(X<=H->Data[Child])
break;
else
{
H->Data[Parent]=H->Data[Child];
}
}
H->Data[Parent]=X;
}
void siftdown(MinHeap H,int i)
{
int t,f=0;
while(i*2<=H->Size&&!f)
{
if(H->Data[i]>H->Data[i*2])t=i*2;
else t=i;
if(i*2+1<=H->Size)
{
if(H->Data[t]>H->Data[i*2+1])t=i*2+1;
}
if(t!=i)
{
int x=H->Data[t];
H->Data[t]=H->Data[i];
H->Data[i]=x;
i=t;
}
else f=1;
}
}
int main()
{
MinHeap mp = CreateHeap(1000);
MinHeap mmm = CreateHeap(1000);
int n,m;
scanf("%d %d",&n,&m);
int M=m;
while(m--)
{
int a;
scanf("%d",&a);
if(a==1)
{
int z;
scanf("%d",&z);
Insert(mp,z);
}
else
DeleteMin(mp);
if(mp->Size>n)mp->Size=n;
for(int i=1; i<=mp->Size; i++)
{
if(i==1)
printf("%d",mp->Data[i]);
else
printf(" %d",mp->Data[i]);
}
printf("\n");
}
scanf("%d",&M);
for(int i=1; i<=M; i++)
{
int z;
scanf("%d",&z);
mmm->Data[i]=z;
}
mmm->Size=M;
for(int i=M/2;i>=1;i--) siftdown(mmm,i);
if(mmm->Size>M)mmm->Size=M;
for(int i=1; i<=mmm->Size; i++)
{
if(i==1)
printf("%d",mmm->Data[i]);
else
printf(" %d",mmm->Data[i]);
}
printf("\n");
return 0;
}
最小堆
最新推荐文章于 2022-01-02 17:25:20 发布