基数排序O(d(n+k)) ---》 O(n);
用下面代码解释字母含义
d;最大元素的长度,决定了桶的数量
k;每一轮计数排序都需要辅助运算,k较大

逻辑比较简单,每一个桶用一次计数排序排序,分别排序个位,排序十位,排序百位,以此类推,最后有序。
源码走起
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#define N 2000
#define K 1000
void Printf(int* p, int n);//打印
int find_max(int* p, int n);//找到最大值
int place(int n);//最大值有多少位
void happen_rand(int* p, int n);//生成随机数
int car_num(int* p, int n);//基数排序
int get_value(int n,int k);//得到第k位的值
int main()
{
    
    int array[N] = { 0 };
    happen_rand(array,N);
    car_num(array, N);
    Printf(array, N);
    return 0;
}

void happen_rand(int* p, int n)
{
    srand();
    for (int i = 0; i < N; i++) {
        p[i] = rand() % K;

    }
}

int find_max(int* p, int n)
{
    int tmp = p[0];
    for (int i = 1; i < n; i++) {
        tmp < p[i] ? tmp = p[i] : tmp;
    }
    return tmp;
}

int place(int n) {

    int tmp = 0;
    while (n > 0) {
        n /= 10;
        tmp++;
    }
    return tmp;
}

void Printf(int* p, int n) {
    for (int i = 0; i < n; i++) {
        printf("%d\n", p[i]);
    }
}

int get_value(int n,int k) {
    while (k-->1) {
        n /= 10;
    }
    n %= 10;
    return n;
}

int car_num(int* p, int n) {
    int max = find_max(p, n);
    int len = place(max);
    int answer[N] = { 0 };
    for (int i = 0; i < len; i++) {
        int tmp[10] = { 0 };
        for (int j = 0; j < n; j++) {
            tmp[get_value(p[j],i+1)]++;
        }//计数排序内容,详见前期博客
        for (int i = 1; i < 10; i++) {
            tmp[i] += tmp[i - 1];
        }//计数排序内容,详见前期博客
        for (int l = 0; l < n; l++) {
            answer[tmp[get_value(p[l], i + 1)] - 1] = p[l];
            tmp[get_value(p[l], i + 1)]--;
        }//计数排序内容,详见前期博客
        for (int i = 0; i < n; i++) {
            p[i] = answer[i];
        }



    }


    return 0;
}