Think:
这道题据说可以用快排 也可以用 堆排序。。 因为每天晚上都得写一篇笔记所以今晚就水过去吧~~~~ 明天补上堆排序的方法(不对明天早上貌似还有天梯模拟,下午还要搬宿舍,那样就明晚补吧) 手动滑稽。。
安利:qsort是自带的快排函数用法:qsort(void base,int nelem,int width,int (*fcmp)(const void ,const void *));
具体说明
qsort(a,1000,sizeof(int),comp); 对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
其中cmp函数须自己编写
例如:int comp(const void*a,const void*b)
{
return (int)a-(int)b;
}
代表的意思是从小到大排序~~~
以下为题目~~~
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
先发快排AC的代码~~~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void *a, const void *b);
int main()
{
int n, m;
int a[1000050];
while(~scanf("%d %d",&n,&m))
{
int i, j, k, t, l;
k = 0;
memset(a, 0, sizeof(0));
for (i = 0;i <= n - 1; i ++)
{
scanf("%d",&t);
if (k < m)
a[k ++] = t;
else
{
l = 0;
for (j = 1;j < k;j ++)
{
if(a[l] > a[j])
l = j;
}
if (a[l] < t)
a[l] = t;
}
}
qsort(a, m, sizeof(a[0]), cmp);
for (i = 0;i <= m - 1;i ++)
{
if (i == m - 1)
printf("%d\n",a[i]);
else
printf("%d ",a[i]);
}
}
return 0;
}
int cmp(const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
/***************************************************
User name:
Result: Accepted
Take time: 200ms
Take Memory: 108KB
Submit time: 2017-02-23 19:42:44
****************************************************/