简单桶排序 -- B2096 直方图
题意简述
给定一个非负整数列
求集合
解法
桶排序裸题。
桶排序的大概意思就是对于数集的值域
在这道题中,我们不仅要对数列进行桶排序,还要在排序的过程中在线处理数列中的最大值,来确定
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=114514;
int bucket[maxn],n,tmp,Fmax;
//输入量比较大,使用快读快写
int read() {
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
int x=0;
while(ch>='0'&&ch<='9') x=(x*10)+(ch^48),ch=getchar();
return x;
}
void wr(int x) {
if(x>9) wr(x/10);
putchar(x%10+'0');
}
void write(int x, char ch='\n') {
wr(x);
putchar(ch);
}
int main(void) {
n=read();
while(n--) tmp=read(),++bucket[tmp],Fmax=(tmp>Fmax)?tmp:Fmax; //更新计数器和 Fmax
for(int i=0;i<=Fmax;++i) write(bucket[i]);
return 0;
}
扩展
桶排序的其它应用
桶排序还有另一个重要应用——去重。我们发现,在桶排序的过程中,序列中出现过的数,计数器的值不为
另一道桶排练习题是 [CSP-J2020] 直播获奖,本题需要强制在线桶排,复杂度 sort 无法通过。当然,这道题也可以用对顶堆,平衡树等多种方法通过。
桶排序的优劣分析
桶排序是目前可以用计算机实现的时间复杂度最优的排序算法,复杂度是严格
然而,优秀的时间复杂度使用空间复杂度换取的。桶排序的空间复杂度是