基数排序
对于给定的数列,首先从最低位开始将其按最低位从小到大进行排序,然后再按照排序顺序生成新的数列,然后再对次低位进行上述操作,直到进行到最大数的最高位
举例 11 12 22 24 35 31 36
最高位为2,所以进行两次排序
首先对个位进行排序
然后对十位进行排序
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191019000022892.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpd2VpeWlf,size_16,color_FFFFFF,t_70)
下面是用二维桶的实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 1e4;
const ll maxm = 1e4;
int n, m;
int w[maxn], cnt[10], buk[10][maxn];
int main() {
freopen("shuru.txt", "r", stdin);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
ll mx = 0;
for (int i = 1; i <= n; i++) {
cin >> w[i];
if (w[i] > mx) {
mx = w[i];
}
}
int dignum = 0;
while (mx > 0) {
dignum++;
mx /= 10;
}
int base = 1;
for (int i = 1; i <= dignum; i++) {
for (int k = 1; k <= n; k++) {
int tmp = (w[k] / base) % 10;
buk[tmp][cnt[tmp]++] = w[k];
}
int ind = 1;
for (int b = 0; b < 10; b++) {
if (cnt[b] == 0)continue;
for (int j = 0; j < cnt[b]; j++) {
w[ind++] = buk[b][j];
}
cnt[b] = 0;
}
base *= 10;
}
for (int i = 1; i <= n; i++) {
cout << w[i] << endl;
}
}
下面是一维数组链表实现,更加节省空间
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191019103711946.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpd2VpeWlf,size_16,color_FFFFFF,t_70)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5;
const ll maxm=1e5;
struct node {
int dat;
int next;
}d[maxn];
int n,m,w[maxn],c[maxn];
void add_value(int u,int v,int i) {
d[i].dat = v;
d[i].next = c[u];
c[u] = i;
}
int main(){
freopen("shuru.txt", "r", stdin);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
int mx = -1;
for (int i = 1; i <= n; i++) {
cin >> w[i];
if (w[i] > mx)mx = w[i];
}
int maxnum = 0;
while (mx > 0) { maxnum++; mx /= 10; }
int base = 1;
for (int i = 1; i <= maxnum; i++) {
memset(c, 0, sizeof(c));
for (int k = n; k >= 1; k--) {
add_value((w[k]/base)%10,w[k],k);
}
int indx = 0;
for (int ind = 0; ind < 10; ind++) {
for (int t = c[ind]; t; t = d[t].next) {
w[++indx] = d[t].dat;
}
}
base *= 10;
}
for (int i = 1; i <= n; i++)cout << w[i] << endl;
}