SDUT 3401 数据结构实验之排序四:寻找大富翁(堆排序)

数据结构实验之排序四:寻找大富翁

Time Limit: 150MS Memory limit: 512K

题目描述

2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁。

输入

首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,数字间以空格分隔。

输出

一行数据,按降序输出资产排前M位的大富翁的个人资产值,数字间以空格分隔,行末不得有多余空格。
 

示例输入

6 3
12 6 56 23 188 60

示例输出

188 60 56

提示

注意:
本题:内存限制是512K
512*1000/4<1000000
所以不能都存入数组后进行排序,
不断进行m个数的维护。

#include<bits/stdc++.h>
using namespace std;
int a[100];
void Heapadjust(int x,int Size)
{
    int lch=x*2;
    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;
        if(Max!=x)
        {
            swap(a[x],a[Max]);
            Heapadjust(Max,Size);
        }
    }
}
int main()
{
    int n,m,t;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=m/2;i>=1;i--)
        {
            Heapadjust(i,m);
        }
        for(int i=m+1;i<=n;i++)
        {
            scanf("%d",&t);
            if(t>a[1])          //节点a[1]肯定是m个数中最小的。
            { a[1]=t;
              Heapadjust(1,m);
            }
        }
        for(int i=m;i>=1;i--)
        {
            swap(a[1],a[i]);
            Heapadjust(1,i-1);
        }
        for(int i=1;i<=m;i++)
        {
            if(i!=1)
                printf(" ");
            printf("%d",a[i]);
        }
        printf("\n");
    }
    return 0;
}
 
  
 
  
 
  
与此题无关::堆排序的模板
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int n,m;
void Heapadjust(int x,int Size)
{
    int lchild=x*2;
    int rchild=x*2+1;
    int Max=x;
    if(x<=Size/2)
    {
        if(lchild<=Size&&a[lchild]>a[Max])
            Max=lchild;
        if(rchild<=Size&&a[rchild]>a[Max])
            Max=rchild;
        if(Max!=i)
        {
            swap(a[x],a[Max]);
            Heapadjust(Max,Size);
        }
    }
}
void Heapsort()
{
    for(int i=n/2;i>=1;i--)  //初次建堆序列
    {
        Heapadjust(i,n);
    }
    for(int i=n;i>=1;i--)    //进行排序
    {
        swap(a[1],a[i]);
        Heapadjust(1,i-1);
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        Heapsort();
        for(int i=n;i>=n-m;i--)
        {
            if(i!=n)
                printf(" ");
            printf("%d",a[i]);
        }
        printf("\n");
    }
    return 0;
}



你可能感兴趣的:(SDUT 3401 数据结构实验之排序四:寻找大富翁(堆排序))