9
来源:互联网 发布:网络初始化失败怎么办 编辑:程序博客网 时间:2024/04/29 13:10
上午看堆,不懂不懂……
下午就写堆排序,模拟了一个建堆的过程,把堆顶存好后,把堆末放到堆顶,重新建堆,结果排好了序。
总感觉不对,一问石学姐,汗,重头戏根本没写——调整。
——为什么要调整呢?重建也可以啊。
——调整比较快。
(杨学长……有点闲)
下面是我只有重建没调整的堆排序:
#include<stdio.h>
#define N 1000
int main()
{
int i,a[N],b[N],n,m,t;
scanf("%d",&m);
n=m;
for(i=1;i<=m;i++)
{
scanf("%d",&a[i]);
}
for(i=1;n>=3;i++)
{
while(n>1)
{
if(n==(n/2*2+1))
{
if((a[n/2]>a[n])&&(a[n/2]>a[n-1]))
{
n=n-2;
}
else if((a[n]>a[n/2])&&(a[n]>a[n-1]))
{
t=a[n/2];
a[n/2]=a[n];
a[n]=t;
n=n-2;
}
else if(a[n-1]>a[n/2]&&a[n-1]>a[n])
{
t=a[n/2];
a[n/2]=a[n-1];
a[n-1]=t;
n=n-2;
}
}
else
{
if(a[n/2]>a[n])
{
n=n-1;
}
else
{
t=a[n/2];
a[n/2]=a[n];
a[n]=t;
n=n-1;
}
}
}
b[i]=a[1];
n=m-i;
a[1]=a[n+1];
}
if(a[2]>a[3])
{
b[m-1]=a[2];
b[m]=a[3];
}
else
{
b[m]=a[2];
b[m-1]=a[3];
}
for(i=1;i<=m;i++)
{
printf("%d ",b[i]);
}
}