计数排序
计数(桶)排序
-
适用:
- 通常是处理需要从小到大(排序),并且统计出现次数的问题,比如有出现一次的,没出现的这种。
- 整数排序 //因为使用数组下标记录的
- 有 确定范围的整数
-
算法思想:将待排序集合中的每个元素值本身大小作为下标,依次进行存放。而记录的次数,就是为了确定该元素值出现了几次。
-
过程:
- 开辟一个数组(大小由数据范围决定)
- 数组要初始化为 0 (因为要在0 的基础上往上加)
- 全局变量就不用手动初始化了,默认值为0(好习惯)
- 循环读入数据(数据值与下标对应)对应的数组值自增1
- 再来一次循环根据出现的次数来输出 ,循环的范围是可以是从1到数据范围最大值
- 优化:第二次循环时候,可以根据出现过的值来进行优化,在第一层循环读入数据的时候就记录读入的数据的最大值和最小值
- 开辟一个数组(大小由数据范围决定)
-
时间复杂度 O(n+k)
-
优缺:
- 优点:线性排序,速度很快
- 缺点:比较浪费空间,当数据的范围比较大的时候开的数组的范围也比较大浪费内存。
-
代码实现
#include<iostream> using namespace std; const int N=1e5+10; int p[N]; int manv=1e-9,minv=1e9,n; int main() { cin>>n; for(int i=0;i<n;i++) { int x; scanf("%d",&x); if(maxv<=x) maxv=x; if(minv>=x) minv=x; p[x]++; } /* for(int i=minv;i<=maxv;i++) if(p[i]==1) cout<<p[i<<" "; */ for(int i=minv;i<=maxv;i++) while(q[i]!=0) { cout<<q[i]; q[i]--; } return 0; }

浙公网安备 33010602011771号