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
請用堆排序完成。
#include <stdio.h>
int a[15];
void Sort(int low, int high)
{
if(low>=high) return;
else
{
int key, i;
key = a[low];
for(i=low*2; i<=high; i*=2)
{
if(i<high&&a[i+1]<a[i]) i++;
if(a[i] >= key) break;
else
{
a[low] = a[i];
low = i;
}
}
a[low] = key;
}
}
int main()
{
int n, m, i, x, t;
scanf("%d %d", &n, &m);
for(i=1;i<=m;i++)
{
scanf("%d", &a[i]);
}
for(i=m/2;i>=0;i--)
{
Sort(i, m);
}
n-=m;
while(n--)
{
scanf("%d", &x);
if(x>a[1])
{
a[1] = x;
for(i=m/2;i>0;i--)
{
Sort(i, m);
}
}
}
for(i=m;i>0;i--)
{
t = a[1];
a[1] = a[i];
a[i] = t;
Sort(1, i-1);
}
for(i=1;i<=m;i++)
{
if(i==m) printf("%d\n", a[i]);
else printf("%d ", a[i]);
}
return 0;
}