代码:
#include<bits/stdc++.h>
using namespace std;
int a[100];
void heapadjust(int x,int Size)
{
int lch=x*2;///Size是数据考查范围的大小
int rch=x*2+1;
int Max=x;
if(x<=Size/2)
{
if(lch<=Size&&a[lch]<a[Max])
Max=lch;
if(rch<=Size&&a[rch]<a[Max])
Max=rch;///根据下标rch和lch查看是否超出数据的考查范围
if(Max!=x)
{
swap(a[x],a[Max]);
heapadjust(Max,Size);
}
}
}
int main()
{
ios::sync_with_stdio(false);///不加会超时
int n,m,t,i;
while(cin>>n>>m)
{
for(i=1;i<=m;i++)
cin>>a[i];
for(i=m/2;i>=1;i--)///一次循环覆盖三个数据,两次五个,三次七个
heapadjust(i,m);///这里并不是要排序,而是将前m个数中最小的那个挪到数组的第一个位置
for(i=m+1;i<=n;i++)
{
cin>>t;///继续输入其它数据并不断对数组进行维护
if(t>a[1])
{
a[1]=t;
heapadjust(1,m);
}
}
// for(i=1;i<=m;i++)
// cout<<a[i]<<endl;
for(i=m;i>=1;i--)///将数组从大到小排序
{
swap(a[1],a[i]);
heapadjust(1,i-1);
}
///sort超时了,估计它是让把所有数都排序再输出了,这个时候上面的那些代码就没用了
//sort(a+1,a+m+1,cmp);
for(i=1;i<=m;i++)///输出
{
if(i!=1)
cout<<' ';
cout<<a[i];
}
cout<<endl;
}
return 0;
}
作为一条咸鱼,最后将数组从大到小排序那段研究了好久...以初始数据23、60、56和188为例;因为数组的第一个数据一定是最小的,所以交换一下,之所以用(1,i-1)而不是(1,i)应该是因为已经通过上一轮的循环找到了当时未排序部分的最小值,所以在3这个查找范围内进一步缩小一下,找到3这个范围内的最大值,然后交换;这是一个循环找最小值,然后交换使最小值到一个正确的位置上,缩小查找范围继续这个过程!!!