从0开始学算法--排序(1.6计数排序)

╄→尐↘猪︶ㄣ 提交于 2019-12-01 12:55:04

比较简单的一种排序方式。可以再O(n+k)的时间复杂度内将数组排序,n为数组长度,k为数组里最大的数字。

原数组:

2 1 7 3 5 8 2

 

 

统计数组:

num【i】表示i数字有多少个 0 1 2 1 0 1 0 1 1
下标 0 1 2 3 4 5 6 7 8

 

 

 

 

 

排序数组:

1 2 2 3 5 7 8

 

 

#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>

using namespace std;

const int maxn=1e5+1;
int n;
int A[maxn];
int T[maxn];//辅助数组。


int main(){
    scanf("%d",&n);
    int k=0;    //数组的最大数
    for(int i=0;i<n;i++){
        scanf("%d",&A[i]);
        T[A[i]]++;
        if(A[i]>k)k=A[i];
    }
    for(int i=0,j=0;i<=k;i++){
        while(T[i]>0){
            A[j++]=i;
            T[i]--;
        }
    }
    for(int i=0;i<n;i++){
        printf("%d ",A[i]);
    }
    printf("\n");
    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!