数据结构实验之排序四:寻找大富翁__咳咳咳,还魂篇!!

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

Time Limit: 200MS Memory Limit: 512KB

Problem Description

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

Input

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

Output

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

 

Example Input

6 3
12 6 56 23 188 60

Example Output

188 60 56

Hint

请用堆排序完成。 

Author

xam

要求用堆排,就用堆排啊。

先传个头像以示敬意,哈哈咳~哈哈哈~

数据结构实验之排序四:寻找大富翁__咳咳咳,还魂篇!!

正文:::


#include <iostream>//头文件别写多咯!!防止超时


using namespace std;


int heap[12], n, m;


void cheap(int l, int r)//建立一个堆~
{
    int j = 2*l;
    while(j<=r)
    {
        if(j<r && heap[j]<heap[j+1])//大根~保证堆的右下角是最小的数~~~
        {
            int k = heap[j];
            heap[j] = heap[j+1];
            heap[j+1] = k;
        }
        if(heap[j]>heap[l])//调整位置
        {
            *heap = heap[j];
            heap[j] =heap[l];
            heap[l] = *heap;
            l = j;
            j *= 2;
        }
        else break;
    }
}
int main()
{
    cin.sync_with_stdio(false);取消*************,也是防止超时,不懂的自行百度
    while(cin>>n>>m)
    {
        int i;
        for(i = 1;i<=m;i++)
            cin>>heap[i];
        for(i = m/2;i>=1;i--)
            cheap(i, m);
        for(i = m+1;i<=n;i++)
        {
            int k;
            cin>>k;
            if(k>heap[m])
            {
                heap[m] = k;
                for(int j = m/2; j>=1;j--)
                    cheap(j, m);
            }
        }
        for(i = 1;i<m;i++)
            cout<<heap[i]<<' ';
        cout<<heap[m]<<endl;
    }
    return 0;
}