zoukankan      html  css  js  c++  java
  • 计数排序(O(n+k)的排序算法,空间换时间)

      计数排序就是利用空间换时间,时间复杂度O(n+k) n是元素个数,k是最大数的个数;

      统计每个数比他小的有多少,比如比a[i]小的有x个,那么a[i]应该排在x+1的位置

      代码:

      

    /*
    * @Author: LyuC
    * @Date:   2017-10-11 21:24:27
    * @Last Modified by:   LyuC
    * @Last Modified time: 2017-10-11 21:39:36
    */
    #include <bits/stdc++.h>
    
    #define MAXN 10005
    
    using namespace std;
    
    int a[MAXN];//原始数组
    int b[MAXN];//结果数组
    int c[MAXN];//统计数组中有多少小于 i 的数
    int k;//最大值是多少
    int n;
    
    int main(){
        freopen("in.txt","r",stdin);
        scanf("%d",&n);
        memset(c,0,sizeof c);
        k=-1;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            k=max(k,a[i]);
            c[a[i]]++;
        }
        for(int i=1;i<=k;i++){
            c[i]+=c[i-1];
        }
        for(int i=0;i<n;i++){
            b[c[a[i]]-1]=a[i];
            c[a[i]]--;
        }
        for(int i=0;i<n;i++){
            cout<<b[i]<<" ";
        }cout<<endl;
        return 0;
    }
  • 相关阅读:
    botzone Tetris2
    NOIP2017游记
    城乡联谊胡策会糊厕R3
    SRM 20
    AtCoder Regular Contest 082
    AtCoder Grand Contest 019
    复数模版
    SRM13
    NOI2017&&codeM2017游记
    java多线程编程
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/7653019.html
Copyright © 2011-2022 走看看