数据结构实验之排序四:寻找大富翁(堆排序)
2016-12-11 16:04
211 查看
数据结构实验之排序四:寻找大富翁
Time Limit: 150MS Memory Limit: 512KBSubmit 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; }
相关文章推荐
- SDUT-3401 数据结构实验之排序四:寻找大富翁(堆排序)
- SDUT 3401 数据结构实验之排序四:寻找大富翁 堆排序
- 数据结构实验之排序四:寻找大富翁(堆排序)
- 数据结构实验之排序四:寻找大富翁(堆排序)
- SDUT 3401 数据结构实验之排序四:寻找大富翁(堆排序)
- 数据结构实验之排序四:寻找大富翁——堆排序
- 数据结构实验之排序四:寻找大富翁(堆排序)
- 数据结构之排序之堆排序。寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- SDUT 3401 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- SDUTACM 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 【最小堆+堆排序】数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁