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