计数排序

计数(桶)排序

  • 适用:

    • 通常是处理需要从小到大(排序),并且统计出现次数的问题,比如有出现一次的,没出现的这种。
    • 整数排序 //因为使用数组下标记录的
    • 确定范围的整数
  • 算法思想:将待排序集合中的每个元素值本身大小作为下标,依次进行存放。而记录的次数,就是为了确定该元素值出现了几次。

  • 过程:

    • 开辟一个数组(大小由数据范围决定)
      • 数组要初始化为 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;
    }
    
posted @ 2020-05-05 19:54  Acm_walker  阅读(129)  评论(0)    收藏  举报