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

来源:互联网 发布:curl json 编辑:程序博客网 时间:2024/05/24 05:57

数据结构实验之排序四:寻找大富翁
Time Limit: 200MS Memory Limit: 512KB
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

请用堆排序完成。
Author
xam

#include<stdio.h>#include<stdlib.h>void exchange(int a[],int x,int y)//交换{    int t;    t = a[x];    a[x] = a[y];    a[y] = t;}void HeapAdjust(int *a,int l,int h)//筛选{    int i,temp;    temp = a[l];    for(i = 2*l;i <= h;i=i*2)    {        if(i < h && a[i] > a[i+1])//i为较大的数的下标;            i++;        if(temp <= a[i])            break;        a[l] = a[i];        l = i;    }    a[l] = temp;}void HeapSort(int *a,int n){    int i;    for(i = n/2;i > 0;i--)//把a[1,n]建成大顶堆        HeapAdjust(a,i,n);    for(i = n;i > 1;i--)    {        exchange(a,1,i);//将堆顶记录和当前未经排序子序列a[1,i]中最后一个记录交换        HeapAdjust(a,1,i-1);//将a[1,i-1]重新调整为大顶堆;    }}int main(){    int m,n,i,j;    int a[15];    int k = 1;    scanf("%d %d",&n,&m);    for(i = 1;i <= n;i++)    {        int x;        scanf("%d",&x);        if(m >= k)            a[k++] = x;        else        {            int b = 1;            for(j = 2;j <= m;j++)            {                if(a[b] > a[j])                    b = j;            }            if(a[b] < x)a[b] = x;        }    }    HeapSort(a,m);    for(i = 1;i <= m;i++)    {        if(i==m)printf("%d\n",a[i]);        else printf("%d ",a[i]);    }    return 0;}