堆排序 c 不知道哪里出错了?请帮忙看下

来源:百度知道 编辑:UC知道 时间:2024/06/14 17:20:34
#include<stdio.h>
int a[100],n;
void sift(int i,int m)
{
int k;
k=2*i;
a[0]=a[i];
while(k<=m)
{
if(k<m && a[k]<a[k+1])
k++;
if(k<=m && a[i]<a[k])
{
a[i]=a[k];
i=k;
k=2*i;
}
else
k=m+1;
}
a[i]=a[0];
}
void heap_sort()
{
int i;
for(i=n/2;i>=1;i--)
sift(i,n);
for(i=n;i>=2;i--)
{
a[0]=a[1];
a[1]=a[i];
a[i]=a[0];
sift(1,i-1);
}
}
int main()
{
freopen("input.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
heap_sort();
for(i=1;i<=n;i++)
printf("%d ",a[i]);
}
比如输入
9
1 2 33 4 5 66 9 10 3
就出错。

#include<stdio.h>
int a[100],n;
void sift(int i,int m)
{
int k;
k=2*i;
a[0]=a[i];
while(k<=m)
{
if(k<m && a[k]<a[k+1])
k++;
if(k<=m && a[0]<a[k])//改的这行,认真点就好了
{
a[i]=a[k];
i=k;
k=2*i;
}
else
k=m+1;
}
a[i]=a[0];
}
void heap_sort()
{
int i;
for(i=n/2;i>=1;i--)
sift(i,n);
for(i=n;i>=2;i--)
{
a[0]=a[1];
a[1]=a[i];
a[i]=a[0];
sift(1,i-1);
}
}
int main()
{
freopen("in.txt","r",stdin);
int i;
scanf("%d",&n);printf("%d\n",n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
heap_sort();

for(i=1;i<=n;i++)
printf("%d ",a[i]);
}
//比如输入
//9
//1 2 33 4 5 66 9 10 3