基数排序

直接做洛谷上面的快拍模板。。用了个log的小优化,时间瞬间优化三分之一。。

 1 #include <cstdio>
 2 using namespace std;
 3 //#define debug
 4 
 5 #ifdef debug
 6 const int maxn=20;
 7 #else
 8 const int maxn=1e5+5;
 9 #endif
10 
11 double log210;
12 int n, maxlen;
13 int a[maxn];
14 int bucket[10][maxn];
15 
16 double log2(float x){
17     return ((((unsigned int&)x>>23)&255)-127);
18 }
19 
20 int len(int x){
21     return log2(x)/log210+1;
22 }
23 
24 int main(){
25     log210=log2(10);
26     scanf("%d", &n);
27     int l;
28     for (int i=0; i<n; ++i) {
29         scanf("%d", &a[i]);
30         l=len(a[i]);
31         if (l>maxlen) maxlen=l;
32     }
33     int num, len, alen=0;
34     for (int i=0, m=1; i<maxlen; ++i, m*=10){
35         for (int j=0; j<10; ++j) bucket[j][0]=0;
36         for (int j=0; j<n; ++j){
37             num=a[j]/m%10;
38             len=++bucket[num][0];
39             bucket[num][len]=a[j];
40         }
41         alen=0;
42         for (int j=0; j<10; ++j)
43             for (int k=1; k<=bucket[j][0]; ++k)
44                 a[alen++]=bucket[j][k];
45     }
46     for (int i=0; i<n; ++i)
47         printf("%d ", a[i]);
48     return 0;
49 }
原文地址:https://www.cnblogs.com/MyNameIsPc/p/7514010.html