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

来源:互联网 发布:linux线程间通信方式 编辑:程序博客网 时间:2024/06/06 04:03

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

请用堆排序完成。

本题时间和空间要求都很高,数据也比较大,所以用堆排,需要求n个人中的m个人,就建一个能存m个数据的最小堆,
然后用剩余的n-m个数据与堆顶元素比较,如果当前元素比堆顶元素小,就continue,若比堆顶元素大,舍弃当前堆顶而将这个数作为新堆顶
最后,最小堆里的元素就是n个数中前m个最大的数;

求前k个最大的数则建立k个数的最小堆
求前k个最小的数则建立k个数的最大堆

#include <iostream>#include <stdio.h>using namespace std;int a[20];//空间能够存m个即可void heapjust(int s, int m)//把a[]建成小堆顶{    int t;    t = a[s];//堆顶元素    for(int i = 2*s; i <= m; i*=2)    {        if(i < m && a[i] > a[i+1])//找左右孩子中较大的一个            i++;        if(t < a[i])            break;        a[s] = a[i];        s = i;    }    a[s] = t;}int main(){    int n, m, i, x;    scanf("%d %d", &n, &m);    for(int i = 1; i <= m; i++)    {        scanf("%d",&a[i]);    }    for(i = m/2; i > 0; i--)    {        heapjust(i, m);//建造m个元素的小堆顶    }    for(i = m+1; i <= n; i++)    {        scanf("%d", &x);        if(x > a[1])//随时替换小堆顶的根元素        {            a[1] = x;//更新小堆顶            heapjust(1, m);//重新将替根元素后的堆调成小堆顶        }    }    for(i = m; i > 1; i--)//将堆顶元素和当前未经排序子序列的最后一个元素交换    {        swap(a[1], a[i]);        heapjust(1, i-1);//重复建小顶堆    }    for(i = 1; i <= m; i++)    {        if(i == 1)            printf("%d", a[i]);        else            printf(" %d", a[i]);    }    printf("\n");}

用数组来仿堆

#include <iostream>#include <stdio.h>#include <algorithm>using namespace std;int a[20];int main(){    ios::sync_with_stdio(false);//加速    int n, m, x;    cin>>n>>m;    for(int i = 0; i < m; i++)    {        cin>>a[i];//将m个元素存入数组里,假设它们是最大值    }    for(int i = m; i < n; i++)    {        cin>>x;        sort(a, a+m);//把之前的m个元素从小到大排序,所以最小值肯定存在a[0]        if(x > a[0])        {            a[0] = x;        }    }    sort(a, a+m);//将“堆”sort排序,从小到大的    for(int i = m-1; i >= 0; i--)    {        if(i == m-1)            cout<<a[i];        else            cout<<" "<<a[i];    }    cout<<endl;    return 0;}
原创粉丝点击