Problem Description
根据人口普查结果,知道目前淄博市大约500万人口,你的任务是帮助人口普查办公室按年龄递增的顺序输出每个年龄有多少人,其中不满1周岁的按0岁计算,1到2周岁的按1岁计算,依次类推,大于等于100岁的老人全部按100岁计算。
Input
输入第一行给出一个正整数N(<=5000000),随后连续给出N个整数表示每个人的年龄,数字间以空格分隔。
Output
按年龄递增的顺序输出每个年龄的人口数,人口数为0的不输出,每个年龄占一行,数字间以一个空格分隔,行末不得有多余空格或空行。
Sample Input
10
16 71 17 16 18 18 19 18 19 20
Sample Output
16 2
17 1
18 3
19 2
20 1
71 1
思路:
1.使用桶排序
2.为了减少时间,使用c,而不是c++的输入输出
桶排序是个很有意思的算法,我认为是一种重要的思想,以后解题中都可以用到
我简单说一下桶排序思路,我们首先要创建桶,所谓桶,其实就是一个数组,那么在我们创建好一个数组之后,一个排序就已经做好了,比如a[0],a[1],a[2]...
那么假设数组的下标代表的是年龄,而我们得到的输入也是年龄,
假设我们得到16,那么就a[16]++,就代表16岁多一个人,也就是说数组的值代表的就是这个年龄的人数(有点像key-value了)
下面是使用这个算法的条件:
1.我们肯定要知道这个数据的范围,比如年龄的范围
2.这个数据不能太大,不然空间上和时间上的开销都会太大
代码:
//桶排序
#include<iostream>
#include<cstring>
using namespace std;
int b[101];
int main(){
int t;
int m;
cin>>t;
memset(b,0,sizeof(b));
for(int i=0;i<t;i++)
{
scanf("%d",&m);
if(m>=100)
b[100]++;
else b[m]++;
}
for(int i=0;i<=100;i++)
{
if(b[i]!=0)
printf("%d %d\n",i,b[i]);
}
return 0;
}
经验
1.memset(b,0,sizeof(b)) 把数组b里面的值全部设置为0
头文件是 #include<cstring>
2.为了提高速度,我们使用c中的输入输出而不是c++中的cin和cout
3.不知道桶排序之前,我们用快排来做,时间上会慢得多,这也就是桶排序的优势,它不是一种比较排序,而且是稳定的
问题
桶排序怎么处理浮点数的排序?
网友评论