我们首先来看一道例题:
题目描述
学校正在选举学生会成员,有 n(n≤999) 名候选人,每名候选人编号分别从 1 到 n,现在收集到了 m(m<=2000000) 张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。
输入格式
输入 n 和 m 以及 m 个选票上的数字。
输出格式
求出排序后的选票编号。
输入输出样例
输入 #1
5 10 2 5 2 2 5 2 2 2 1 2
输出 #1
1 2 2 2 2 2 2 2 5 5
分析:
看到这道题,我们一般会想到直接把选票存入数组然后用sort直接排序,但是直接让投票人把选票投入一个箱中,后期的统计效率很低,不如让投票这个过程自行完成排序:开n个票箱,依次读入选票,然后将票号数加到对应的箱子中,最后按票箱的编号依次输出即可,这样也能保证数字从小到大。
这种方法就是计数排序,但只适用于范围不是很大的数字(无法建立合适的“票箱”,空间不够),而且也无法对浮点数和字符串进行排序。
代码
#include<iostream>
using namespace std;
const int N=1e5;
int a[N];
int n,m,tmp;
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>tmp;
a[tmp]++;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=a[i];j++)
{
cout<<i<<' ';
}
}
return 0;
}