数据结构实验之排序四:寻找大富翁(堆排序)
2016-01-30 22:10
375 查看
数据结构实验之排序四:寻找大富翁
Time Limit: 150ms Memory limit: 512K 有疑问?点这里^_^
题目描述
2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁。输入
首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,数字间以空格分隔。输出
一行数据,按降序输出资产排前M位的大富翁的个人资产值,数字间以空格分隔,行末不得有多余空格。示例输入
6 3 12 6 56 23 188 60
示例输出
188 60 56
提示
请用堆排序完成。#include<iostream> #include<stdio.h> using namespace std; int a[20]; void MinHeapAdjust(int *a,int i,int n)//对堆的调整 { int j,temp; temp=a[i]; j=2*i+1; while (j<n) { if (j+1<n&&a[j+1]<a[j])//在左右孩子中找最小的 j++; if (a[j]>=temp) //当找出的最小的值仍大于父节点是终止循环 break; a[i]=a[j]; i=j; j=2*i+1; } a[i]=temp; } void MakeMinHeap(int *a,int n)//建立小顶堆 { for (int i=n/2-1;i>=0;i--) { MinHeapAdjust(a,i,n); } } void MinHeapSort(int *a,int n)//堆排序 { MakeMinHeap(a,n); for (int i=n-1;i>=1;i--) { swap(a[i],a[0]); MinHeapAdjust(a,0,i); } } int main() { int n,m,x; scanf("%d%d",&n,&m); for (int i=0;i<m;i++) { scanf("%d",&a[i]); } MakeMinHeap(a,m);//建立小顶堆,a[0]为最小值 for (int i=m;i<n;i++) { scanf("%d",&x); if (x<a[0]) continue; a[0]=x;//当输入的值大于a[0]是替换a[0]并重新创建小顶堆,使a[0]保持为a[0]~a[m-1]中的最小值,否则忽略 MakeMinHeap(a,m); } MinHeapSort(a,m);//对a[0]~a[m-1]中数据进行堆排序 for (int i=0;i<m;i++) { printf("%d%c",a[i],i==m-1?'\n':' '); } return 0; }
相关文章推荐
- 4-5-创建索引表-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
- 4-4-串的KMP匹配算法-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
- 《树》之伸展树
- 线性表 之 集合的合并 (数据结构java语言版)
- 写的数据结构1对多再对多的形式结构
- 【数据结构和算法】Hash Table
- 数据结构实验之链表七:单链表中重复元素的删除
- 数据结构与算法的联系
- Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c
- 数据结构(寒假小结)——3.2队列
- 数据结构——线性表
- Android笔记 - Binder之数据结构(一)
- Guid算法与标识列(自动增长字段)在表中的应用
- 高级数据结构实现——自顶向下伸展树
- 高级数据结构实现——自顶向下伸展树
- 数据结构学习心得总结
- 2015年大二上-数据结构-图-1-(5)-迷宫问题之图深度优先遍历解法
- 树[数据结构]
- 小蚂蚁学习数据结构(26)——题目——输出二叉树上值大于x的算法
- guava cache 存储的数据结构3 之 ValueReference -- 4