堆排列

来源:互联网 发布:gta5捏脸数据女爱丽丝 编辑:程序博客网 时间:2024/05/22 11:45
#include<stdio.h>

int h[101],n;

交换函数

void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;

}

向下调整函数

void softdown(int i)
{
int t;
int flag=0;
while(i*2<=n&&flag==0)
{
if(h[i*2]<h[i])
t=2*i;
else
t=i;
if(i*2+1<=n)
{
if(h[i*2+1]<h[t])
t=i*2+1;

if(t!=i)
{
swap(t,i);
i=t;
}
else 
flag=1;

}

}

建立堆的函数

void creat()
{
int i;
for(i=n/2;i>=1;i--)
{
softdown(i);
}
}
删除最小的数
int deletemin()
{
int t;
t=h[1];
h[1]=h[n];
n--;
softdown(1);
return t;

   int main()
   {
    int i,num;
    scanf("%d",&num);
    for(i=1;i<=num;i++)
    {
    scanf("%d",&h[i]);
  }
    n=num;//注意全局变量n的用法
    creat();
    for(i=1;i<=num;i++)
    {
    printf("%d",deletemin());


}
return 0;
  }
   
0 0