数据结构实验之排序四:寻找大富翁
Time Limit: 200MS Memory Limit: 512KB
Submit Statistic Discuss
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
请用堆排序完成。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
struct heap
{
int *arr;
int len;
};
void heapInit(heap &H)
{
H.arr = (int *)malloc(sizeof(int)*20);
H.len = 0;
}
void heapAdjudst(heap &H,int start,int end)
{
int temp = H.arr[start];
for(int i = start*2;i<=end;i = i*2)
{
if(i<end&&H.arr[i+1]<H.arr[i])
{
i++;
}
if(temp<H.arr[i])
{
break;
}
H.arr[start] = H.arr[i];
start = i;
}
H.arr[start] = temp;
}
void heapSort(heap &H,int m)
{
for(int i = m;i>1;i--)
{
int temp = H.arr[i];
H.arr[i] = H.arr[1];
H.arr[1] = temp;
heapAdjudst(H,1,i-1);
}
}
int main()
{
int n,m,temp;
heap H;
heapInit(H);
scanf("%d %d",&n,&m);
for(int i = 0;i<m;i++)
{
scanf("%d",&temp);
H.arr[++H.len] = temp;
}
for(int i = m/2;i>0;i--)
heapAdjudst(H,i,m);
for(int i = m;i<n;i++)
{
scanf("%d",&temp);
if(temp>H.arr[1])
{
H.arr[1] = temp;
for(int j = m/2;j>0;j--)
heapAdjudst(H,j,m);
}
}
heapSort(H,m);
for(int i = 1;i<=m;i++)
{
if(i==1)
printf("%d",H.arr[i]);
else
printf(" %d",H.arr[i]);
}
cout<<endl;
return 0;
}