计数排序(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;
}

 

posted @ 2017-10-11 21:43  勿忘初心0924  阅读(468)  评论(0编辑  收藏  举报