堆排序特点之一就是不需要将全部都数据都进行排序就可以确定几个较大值,或者说堆排序适合只需要找到几个最大的元素或者最小的元素的情况下的排序;
SDUTOJ 3401
请用堆排序完成。
正确答案
#include <stdio.h>
#include <stdbool.h>
int data[11];
void perdown(int head,int tail)
{
int parent,child;
int x;
x=data[head];
for(parent=head; (parent*2+1) <= tail; parent=child)
{
child=parent*2+1;
if((child!=tail)&&(data[child]>data[child+1]))
child++;
if( x <= data[child] )
break;
else
data[parent]=data[child];
}
data[parent]=x;
}
int main()
{
int n,m,i;
scanf("%d%d",&n,&m);
for( i=0; i<m; ++i)
{
scanf("%d",&data[i]);
}
for( i=m/2-1; i>=0; --i)
{
perdown(i,m-1);
}
for( i=m;i<n;++i)
{
int num;
scanf("%d",&num);
if(num>data[0])
{
data[0]=num;
perdown(0,m-1);
}
}
for( i=m-1 ; i>=0; --i)//进行堆排序;
{
int t=data[0];
data[0]=data[i];
data[i]=t;//可使用swap()
perdown(0,i-1);
}
bool f=1;
for( i=0; m--; ++i)
{
if(f)
{
printf("%d",data[i]);
f=0;
}
else
{
printf(" %d",data[i]);
}
}
printf("\n");
return 0;
}
最接近答案的MLE
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int data[1000005];
void perdown(int head,int tail)
{
int parent,child;
int x;
x=data[head];
for(parent=head; (parent*2+1) <= tail; parent=child)
{
child=parent*2+1;
if((child!=tail)&&(data[child]<data[child+1]))
child++;
if( x >= data[child] )
break;
else
data[parent]=data[child];
}
data[parent]=x;
}
int main()
{
int n,m,i;
scanf("%d%d",&n,&m);
for( i=0; i<n; ++i)
{
scanf("%d",&data[i]);
}
for( i=n/2-1; i>=0; --i)
{
perdown(i,n);
}
for( i=n-1 ; i>n-4; --i)
{
int t=data[0];
data[0]=data[i];
data[i]=t;
perdown(0,i-1);
}
bool f=1;
for( i=n-1; m--; --i)
{
if(f)
{
printf("%d",data[i]);
f=0;
}
else
{
printf(" %d",data[i]);
}
}
printf("\n");
return 0;
}