#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位置,若vis[i]vis[i]不为0,就输出多少遍ii。从而到达了排序的目的。

特别注意:桶排序不适用于负数或者值域分散特别广阔的数据类型,因为数组是连续编号的,需要内存空间

桶排序时间复杂度O(N)O(N) NN为输入的元素个数,但是元素一般不允许超过数组的内存空间大小,一般10810^8以内的非负整数可以用桶排序

题目描述

给定NN个非负整数,(1N10000000)(1\leq N\leq 10000000)保证所有整数均不超过100100,请你从小到大输出它们

输入

第一行输入一个整数NN,表示接下来要输入NN个非负整数1N100000001\leq N\leq 10000000 .

接下来输入NN个非负整数,不超过100100

输出

从小到大排序输出

样例

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;
}