数据结构实验之排序四:寻找大富翁
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<stdio.h>
#include<stdlib.h>
void exchange(int a[],int x,int y)//交换
{
int t;
t = a[x];
a[x] = a[y];
a[y] = t;
}
void HeapAdjust(int *a,int l,int h)//筛选
{
int i,temp;
temp = a[l];
for(i = 2*l;i <= h;i=i*2)
{
if(i < h && a[i] > a[i+1])//i为较大的数的下标;
i++;
if(temp <= a[i])
break;
a[l] = a[i];
l = i;
}
a[l] = temp;
}
void HeapSort(int *a,int n)
{
int i;
for(i = n/2;i > 0;i--)//把a[1,n]建成大顶堆
HeapAdjust(a,i,n);
for(i = n;i > 1;i--)
{
exchange(a,1,i);//将堆顶记录和当前未经排序子序列a[1,i]中最后一个记录交换
HeapAdjust(a,1,i-1);//将a[1,i-1]重新调整为大顶堆;
}
}
int main()
{
int m,n,i,j;
int a[15];
int k = 1;
scanf("%d %d",&n,&m);
for(i = 1;i <= n;i++)
{
int x;
scanf("%d",&x);
if(m >= k)
a[k++] = x;
else
{
int b = 1;
for(j = 2;j <= m;j++)
{
if(a[b] > a[j])
b = j;
}
if(a[b] < x)a[b] = x;
}
}
HeapSort(a,m);
for(i = 1;i <= m;i++)
{
if(i==m)printf("%d\n",a[i]);
else printf("%d ",a[i]);
}
return 0;
}