SDUT-3401

代码:

#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这个范围内的最大值,然后交换;这是一个循环找最小值,然后交换使最小值到一个正确的位置上,缩小查找范围继续这个过程!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值