数据结构实验之排序四:寻找大富翁__咳咳咳,还魂篇!!
数据结构实验之排序四:寻找大富翁
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;
}