#include <stdio.h>
int h[100],n;
void swap(int x,int y) //交换两个元素
{
int temp;
temp=h[x];
h[x]=h[y];
h[y]=temp;
}
void siftdownmin(int x) //从x结点向下调整堆 生成小根堆
{
int flag=0,t;
while(x*2<=n&&!flag)
{
if(h[x]>h[x*2])
{
t=x*2;
}
else
{
t=x;
}
if(x*2+1<=n&&h[t]>h[x*2+1])
{
t=x*2+1;
}
if(t!=x)
{
swap(x,t);
x=t;
}
else
flag=1;
}
}
void siftdownmax(int x) //从x结点开始向下调整 生成大根堆
{
int flag=0,temp;
while(x*2<=n&&!flag)
{
if(h[x]<h[x*2])
{
temp=x*2;
}
else
{
temp=x;
}
if(h[x]<h[x*2+1])
{
temp=x*2+1;
}
if(x!=temp)
{
swap(x,temp);
x=temp;
}
else
{
flag=1;
}
}
}
void creatmin(int x) //生成x个元素的小根堆
{
for(int i=x/2;i>=1;i--)
{
siftdownmin(i);
}
}
void creatmax(int x) //生成x个元素的大根堆
{
for(int i=x/2;i>=1;i--)
{
siftdownmax(i);
}
}
void siftup(int x) //插入x,并生成最小堆
{
h[++n]=x;
int i=n,flag=0;
while(i>1&&!flag)
{
if(h[i]<h[i/2])
{
swap(i,i/2);
i/=2;
}
else
{
flag=1;
}
}
}
void delmin()
{
h[1]=h[n--]; //删除最小的数
siftdownmin(1);
}
void delmax() //删除最大的元素
{
h[1]=h[n--];
siftdownmax(1);
}
int siftkmin(int k)
{ //寻找第k大寻元素
creatmin(k);
for(int i=k+1;i<=n;i++)
{
if(h[i]>h[1])
{
h[1]=h[i];
creatmin(k);
}
}
return h[1];
}
int siftkmax(int k)
{
creatmax(int k);
while(int i=k+1;i<=n;i++)
{
if(h[i]<h[1])
{
h[1]=h[i];
creatmax(k);
}
}
}
void headsort() //对x个元素进行堆排序
{
while(n--)
{
swap(1,n);
siftdownmax(1); //用大根堆 从小到大排序
//siftdownmin(1); 用小根堆 从大向小排序
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
}
creatmin(n); //生成小根堆
//creatmax(n); 生成大根堆
for(int i=1;i<=n;i++)
printf("%d ",h[i]);
return 0;
}
堆 (堆排序 删除元素 插入元素 寻找第k大、第k小元素)
最新推荐文章于 2022-04-20 19:41:42 发布