请教这排序代码怎么会错呢?

sandbad0x 2009-10-15 09:21:07

#include<stdio.h>
int a[100],n;
void sift(int i,int m)
{
int k,temp;
k=2*i;
temp=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];
k*=2;
}
else
break;
}
a[k/2]=temp;
}
void heap_sort()
{
int temp;
for(int i=n/2;i>0;i--)
sift(i,n);
for(i=n;i>0;i--)
{
temp=a[1];
a[1]=a[i];
a[i]=temp;
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]);
}

这是堆排序代码,不知道错在哪里,请教各位。
...全文
94 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandbad0x 2009-10-18
  • 打赏
  • 举报
回复
搞了半天也没人回答,最终还是自己发现错误了:

a[i]=a[k];
i=k;
a[i]=a[0];<--------
k=2*i;
sandbad0x 2009-10-16
  • 打赏
  • 举报
回复
这是用VC调的啊,不过把代码改过之后还是不行。
以下加斜杠的都是改后之后的代码。

#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()
{
int i;//
freopen("input.txt","r",stdin);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
heap_sort();
for(i=1;i<=n;i++)
printf("%d ",a[i]);
}
withoutme_hw 2009-10-16
  • 打赏
  • 举报
回复
lz你的代码我编译通不过,
void heap_sort()
{
int temp;
for(int i=n/2;i>0;i--) //这样定义i,作用域只在这个for循环中
sift(i,n);
for(i=n;i>0;i--) //上面定义的i在这里已经无效了
{
temp=a[1];
a[1]=a[i];
a[i]=temp;
sift(1,i-1);
}
}

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧