堆排序

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

                                                              Time Limit: 200 ms                Memory Limit: 512 KiB

Problem Description

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

Input

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

Output

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

 

Sample Input

6 3
12 6 56 23 188 60

Sample Output

188 60 56

Hint

请用堆排序完成。 

Source

xam

注意:

        这道题给的内存有点小,对时间的要求也挺高的,所以不能单纯的定义一个数组,要改变一个想法,也就是对前m个进行推排,如果后面有比已存数组大的就会替代,这样会减少很多的内存。

#include 
#include 
#include 
int a[100];
void HeapAdjust(int a[],int s,int t)
{
    int k, j;
    k = a[s];
    for(j = 2*s;j <= t;j *= 2)
    {
        if(j  a[j+1])
        {
            j++;
        }
        if(k < a[j])
            break;
        a[s] = a[j];
        s = j;
    }
    a[s] = k;
}
void Heapsort(int a[],int n)
{
    int t;
    for(int i = n;i > 1;i--)
    {
        t = a[1];
        a[1] = a[i];
        a[i] = t;
        HeapAdjust(a,1,i-1);
     }
}
int main()
{
    int i, j, n, m, num;
    scanf("%d %d",&n,&m);
    for(i = 1; i <= m; i++)
    {
        scanf("%d",&a[i]);
    }
    for(i = m/2; i >= 1; i--)
    {
        HeapAdjust(a,i,m);
    }
    for(i = m+1; i <= n; i++)
    {
        scanf("%d",&num);
        if(num > a[1])
        {
            a[1] = num;
            for(j = m/2; j >= 1; j--)
            {
                HeapAdjust(a,j,m);
            }
        }
    }
    Heapsort(a,m);
    for(i = 1;i <= m;i++)
    {
        if(i == m)
            printf("%d\n",a[i]);
        else printf("%d ",a[i]);
    }
    return 0;
}

 

你可能感兴趣的:(OJ)