#831. 【文件读写】桶排序
【文件读写】桶排序
题目背景
本题是桶排序模板题,桶排序通常最核心的就是用内存空间来换取排序时间,往往执行效率比较高,但是需要的内存空间也比较大。

回顾之前所学的利用数组连续开辟的存储空间来统计个数的思路,其实对于N个数字来说,想要把它们排好序比较简单,步骤如下:
先利用数组来统计每个数字出现的次数,然后枚举该数组的每一个位置(从0到max),只要这个位置的值不为0,我们就输出多少遍当前的值。
举个例子:对5 5 2 2 3 4 1从小到大排序
先用vis数组统计每个数字的值,那么你会观察到
vis[0]=0,vis[1]=1,vis[2]=2,vis[3]=1,vis[4]=1,vis[5]=2
我们枚举vis数组的0到5位置,若不为0,就输出多少遍。从而到达了排序的目的。
特别注意:桶排序不适用于负数或者值域分散特别广阔的数据类型,因为数组是连续编号的,需要内存空间
桶排序时间复杂度 为输入的元素个数,但是元素一般不允许超过数组的内存空间大小,一般以内的非负整数可以用桶排序
题目描述
给定个非负整数,保证所有整数均不超过,请你从小到大输出它们
输入
第一行输入一个整数,表示接下来要输入个非负整数 .
接下来输入个非负整数,不超过
输出
从小到大排序输出
样例
5
5 4 3 2 1
1 2 3 4 5
本题数据量非常大,请用更快的输入方式例如scanf或者关闭cin同步流
关闭同步流代码如下
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
int main() {
IOS;
在下面开始正式写代码
return 0;
}
快速读入代码,这是最快的
#include<bits/stdc++.h>
template<typename T>void read(T &res) {
bool flag=false;
char ch;
while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
for(res=ch-48; isdigit(ch=getchar()); res=(res<<1)+(res<<3)+ch - 48);
flag&&(res=-res);
}
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
int main() {
IOS;
int x;
read(x);//读入X的值 仅限于整数
return 0;
}
Related
In following contests: