基数排序模板

来源:互联网 发布:linux启动盘软碟通制作 编辑:程序博客网 时间:2024/06/05 02:55

基数排序

先按个位排, 再按10位排, 以此类推。

复杂度O(nd)

d为最大数位数

据说好像可以换个底数来加速, 不过我是以10为底

#include <cstdio>#include <string.h>#define N 100005#define ll long longint a[N], w[15], h[15], k, f[N], t, p[N], cnt;ll b[15] = {0, 1};int main(){    int i, j, n;    scanf("%d", &n);    for(i = 1; i <= n; i++) scanf("%d", &a[i]);    for(i = 2; i <= 9; i++) b[i] = b[i-1] * 10;    for(i = 1; i <= 9; i++){        memset(h, 0, sizeof(h));        memset(f, 0, sizeof(f));        for(j = 1; j <= n; j++){            k = a[j] / b[i] % 10;            if(!h[k]) h[k] = w[k] = j;            else f[w[k]] = j, w[k] = j;        }        cnt = 0;        for(j = 0; j <= 9; j++)            for(t = h[j]; t; t = f[t]) p[++cnt] = a[t];        memcpy(a, p, sizeof(a));    }    for(i = 1; i <= n; i++) printf("%d ", a[i]);    return 0;}


原创粉丝点击