桶排序
桶排序 (Bucket sort):如果需要排序的数据在一个明显有限范围内(整型)时,我们可以用数组下标与数值一一对应,将每个数值放进与它对应的数组元素(桶)中,然后按照顺序输出各桶的值,将得到有序的序列。
序列排序
有n个正整数,数字范围在1~10000之间,请你将这n个数字从小到大输出。
【输入描述】第一行一个正整数n,接下来一行n个数字。(n不超过500000)
【输出描述】从小到大输出这n个数字。
【样例输入】5
2 3 4 6 3
【样例输出】2 3 3 4 6
序列排序参考代码
#include<iostream>
using namespace std;
int a[10005];
int main()
{
int n,t;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t;
a[t]++;
}
for(int i=1;i<=10000;i++)
for(int j=1;j<=a[i];j++)
{
cout<<i<<' ';
}
return 0;
}
奇怪的排序
现在有n个整数,范围在-1000~1000, 请你设计程序,将这些数据排序后从大到小输出。
【输入描述】第一行输入一个正整数n。(10000≤n≤50000)
第二行输入n个空格隔开的整数。
【输出描述】输出一行,n个空格隔开的整数。
【样例输入】5
-1 2 4 -3 5
【样例输出】5 4 2 -1 -3
奇怪的排序参考代码
#include<iostream>
using namespace std;
int a[10005];
int main()
{
int n,t;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t;
a[t]++;
}
for(int i=1;i<=10000;i++)
for(int j=1;j<=a[i];j++)
{
cout<<i<<' ';
}
return 0;
}
桶排序的应用
我们可以利用桶来完成去重与计数的任务。
解决去重问题时,只需将每个数据装入桶中后,再根据桶中是否有数据(tong[i]>0),来输出对应的桶的编号。
解决计数问题的时候,我们只需要输出桶中的数据即为元素出现的次数。
教务主任的烦恼
小卓所在的学校近期统计了师生的年龄数据,教务处主任希望你帮忙把这些年龄按从小到大的顺序排序,重复的年龄只保留一个。作为编程小高手的你能帮他解决这个问题吗?
【输入描述】 输入共两行,第一行输入整数n,表示要输入n位师生的年龄;
第二行输入n个整数,用空格分开,分别表示每一位老师或学生的年龄。
(0<n<=100000,0<年龄<=100)
【输出描述】输出为一行,输出去掉重复后从小到大排列的年龄,年龄中间用空格隔开。
【输入样例】
10
15 28 35 15 45 23 14 19 26 33
【输出样例】
14 15 19 23 26 28 33 35 45
教务主任的烦恼参考代码
int main()
{
int n,t;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t;
a[t]++;
}
for(int i=1;i<=100;i++)
if(a[i])
cout<<i<<' ';
return 0;
}
信息学成绩统计
合肥市中小学刚刚结束期中测试,信息学老师想统计全市学生信息学成绩的得分情况,即某些分数的人数,以便改进教学内容和方法,提高同学们的信息学成绩,同学们写个程序,帮助老师实现吧。
【输入描述】输入数据共 3行。第一行两个由空格分隔的正整数n和k,n表示全市所有学生的人数,k表示老师想要统计k个分数的人数;
接下来一行共有n个由空格分隔的正整数,表示每一位学生的成绩,第三行有k个由空格分隔的正整数,表示想要统计的k个分数。
(1≤n≤10000000;0≤k,每个分数≤100)
【输出描述】一行 k个由空格分隔的正整数,对应每个得分的学生数。
【输入样例】10 3
90 96 60 65 67 72 75 75 80 85
65 75 95
【输出样例】
1 2 0
信息学成绩统计参考代码
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a;
t[a]++;
}
for(int i=1;i<=k;i++){
cin>>a;
cout<<t[a]<<' ';
}
return 0;
}