33,028
社区成员
发帖
与我相关
我的任务
分享
#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]);
}
a[i]=a[k];
i=k;
a[i]=a[0];<--------
k=2*i;
#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]);
}
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);
}
}