您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之排序四:寻找大富翁(堆排序)

2016-12-11 16:04 211 查看


数据结构实验之排序四:寻找大富翁

Time Limit: 150MS Memory Limit: 512KB

Submit Statistic


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<algorithm>

using namespace std;

void creat_tree_down(int *a, int i, int n)///调整堆结构
{
int temp=a[i];
int j=2*i+1;
while(j<n)
{
if(j+1<n&&a[j]>a[j+1])
++j;
if(temp<=a[j])
break;
a[i]=a[j];
i=j;
j=2*i+1;
}
a[i]=temp;
}

void creat_tree(int *a, int n)///构建堆结构
{
for(int i=n/2-1; i>=0; --i)
creat_tree_down(a, i, n);
}

void delet_tree(int *a, int i, int n)///删除堆顶元素
{
swap(a[0], a[n-1]);
creat_tree_down(a, 0, n-1);
}

void sort_head(int *a, int n)
{
for(int i=n-1;i>0;--i)
{
swap(a[0], a[i]);
creat_tree_down(a, 0, i);
}
}

int main()
{
ios::sync_with_stdio(false);
int a[1000+100];
int n, m;
cin>>n>>m;
for(int i=0;i<m;++i)
cin>>a[i];
creat_tree(a, m);
for(int i=m;i<n;++i)
{
int x;
cin>>x;
if(x>a[0])
{
a[0]=x;
creat_tree(a, m);///也可以用creat_tree_down(a, 0, m);
}
}
sort_head(a, m);

for(int i=0;i<m;++i)
{
i==0?cout<<a[i]:cout<<" "<<a[i];
}
cout<<endl;

return 0;
}


关于堆排序,如果大家不知道从哪里入门的话,可以参考一下这个网址

下面是用最大堆实现的这个题目,虽然会超内存。
#include<iostream>
#include<algorithm>

using namespace std;

void creat_tree_down(int *a, int i, int n)///调整堆结构
{
int temp=a[i];
int j=2*i+1;
while(j<n)
{
if(j+1<n&&a[j]<a[j+1])///构造一个最大堆
++j;
if(temp>=a[j])
break;
a[i]=a[j];
i=j;
j=2*i+1;
}
a[i]=temp;
}

void creat_tree(int *a, int n)///构建堆结构
{
for(int i=n/2-1; i>=0; --i)
creat_tree_down(a, i, n);
}

void delet_tree(int *a, int i, int n)///删除堆顶元素
{
swap(a[0], a[n-1]);
creat_tree_down(a, 0, n-1);
}

void sort_head(int *a, int n)///进行堆排
{
for(int i=n-1;i>0;--i)
{
swap(a[0], a[i]);
creat_tree_down(a, 0, i);
}
}

int a[100000+100];

int main()
{
ios::sync_with_stdio(false);
int n, m;
cin>>n>>m;
for(int i=0;i<n;++i)
cin>>a[i];
creat_tree(a, n);
sort_head(a, n);
for(int i=n-1;i>=n-m;--i)
{
i==n-1?cout<<a[i]:cout<<" "<<a[i];
}
cout<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: