数据结构实验之排序四:寻找大富翁
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
#include <stdio.h>
#include <stdlib.h>
int h[15],b;
void swap(int a,int c)
{
int i;
i=h[a];
h[a]=h[c];
h[c]=i;
}
void kk(int i)
{
int flag=0,t;
while(i*2<=b&&flag==0)
{
if(h[i]<h[i*2])
t=i;
else t=i*2;
if(i*2+1<=b)
{
if(h[i*2+1]<h[t])
t=i*2+1;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else flag=1;
}
}
void merge()
{
int i;
for(i=b/2;i>=1;i--)
{
kk(i);
}
}
void kk1(int i)
{
int flag=0,t;
while(i*2<=b&&flag==0)
{
if(h[2*i]>h[i])
t=i*2;
else t=i;
if(i*2+1<=b)
{
if(h[i*2+1]>h[t])
t=i*2+1;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else flag=1;
}
}
void merge1()
{
int i;
for(i=b/2;i>=1;i--)
{
kk1(i);
}
}
int deal()
{
int i;
i=h[1];
h[1]=h[b];
b--;
kk1(1);
return i;
}
int main()
{
int a,c,d,e;
while(~scanf("%d %d",&a,&b))
{
for(c=1;c<=b;c++)
{
scanf("%d",&h[c]);
}
merge();
for(c=b+1;c<=a;c++)
{
scanf("%d",&d);
if(d>h[1])
h[1]=d;
kk(1);
}
merge1();
e=b;
for(c=1;c<=e;c++)
{
if(c==e)
printf("%d\n",deal());
else printf("%d ",deal());
}
}
return 0;
}