void sort(unsigned *a, int n)
{
unsigned *b=new unsigned[n];
unsigned *ptr0[256],*ptr8[256],*ptr16[256],*ptr24[256];
unsigned cnt0[256], cnt8[256], cnt16[256], cnt24[256];
unsigned *p;
for (int i = 0; i < 256; ++i)
{
cnt0[i] = 0;
cnt8[i] = 0;
cnt16[i] = 0;
cnt24[i] = 0;
}
for (int i = 0; i < n;i+=8){
++cnt0[a[i+0]&255], ++cnt8[a[i+0]>>8&255], ++cnt16[a[i+0]>>16&255], ++cnt24[a[i+0]>>24];
++cnt0[a[i+1]&255], ++cnt8[a[i+1]>>8&255], ++cnt16[a[i+1]>>16&255], ++cnt24[a[i+1]>>24];
++cnt0[a[i+2]&255], ++cnt8[a[i+2]>>8&255], ++cnt16[a[i+2]>>16&255], ++cnt24[a[i+2]>>24];
++cnt0[a[i+3]&255], ++cnt8[a[i+3]>>8&255], ++cnt16[a[i+3]>>16&255], ++cnt24[a[i+3]>>24];
++cnt0[a[i+4]&255], ++cnt8[a[i+4]>>8&255], ++cnt16[a[i+4]>>16&255], ++cnt24[a[i+4]>>24];
++cnt0[a[i+5]&255], ++cnt8[a[i+5]>>8&255], ++cnt16[a[i+5]>>16&255], ++cnt24[a[i+5]>>24];
++cnt0[a[i+6]&255], ++cnt8[a[i+6]>>8&255], ++cnt16[a[i+6]>>16&255], ++cnt24[a[i+6]>>24];
++cnt0[a[i+7]&255], ++cnt8[a[i+7]>>8&255], ++cnt16[a[i+7]>>16&255], ++cnt24[a[i+7]>>24];
}
switch(n&7){
case 7:++cnt0[a[n-6]&255], ++cnt8[a[n-6]>>8&255], ++cnt16[a[n-6]>>16&255], ++cnt24[a[n-6]>>24];
case 6:++cnt0[a[n-5]&255], ++cnt8[a[n-5]>>8&255], ++cnt16[a[n-5]>>16&255], ++cnt24[a[n-5]>>24];
case 5:++cnt0[a[n-4]&255], ++cnt8[a[n-4]>>8&255], ++cnt16[a[n-4]>>16&255], ++cnt24[a[n-4]>>24];
case 4:++cnt0[a[n-3]&255], ++cnt8[a[n-3]>>8&255], ++cnt16[a[n-3]>>16&255], ++cnt24[a[n-3]>>24];
case 3:++cnt0[a[n-2]&255], ++cnt8[a[n-2]>>8&255], ++cnt16[a[n-2]>>16&255], ++cnt24[a[n-2]>>24];
case 2:++cnt0[a[n-1]&255], ++cnt8[a[n-1]>>8&255], ++cnt16[a[n-1]>>16&255], ++cnt24[a[n-1]>>24];
case 1:++cnt0[a[n-0]&255], ++cnt8[a[n-0]>>8&255], ++cnt16[a[n-0]>>16&255], ++cnt24[a[n-0]>>24];
default: break;
}
ptr0[0]=b-1,ptr8[0]=a-1,ptr16[0]=b-1,ptr24[0]=a-1;
for (int i = 1; i < 256; ++i){
ptr0[i] = ptr0[i-1]+cnt0[i-1];
ptr8[i] = ptr8[i-1]+cnt8[i-1];
ptr16[i] = ptr16[i-1]+cnt16[i-1];
ptr24[i] = ptr24[i-1]+cnt24[i-1];
}
#define countingSort(a,k) \
for (int i = 0; i < n; i += 8){\
*++ptr##k[a[i+0]>>k&255]=a[i+0];\
*++ptr##k[a[i+1]>>k&255]=a[i+1];\
*++ptr##k[a[i+2]>>k&255]=a[i+2];\
*++ptr##k[a[i+3]>>k&255]=a[i+3];\
*++ptr##k[a[i+4]>>k&255]=a[i+4];\
*++ptr##k[a[i+5]>>k&255]=a[i+5];\
*++ptr##k[a[i+6]>>k&255]=a[i+6];\
*++ptr##k[a[i+7]>>k&255]=a[i+7];\
}\
switch(n&3){\
case 7:*++ptr##k[a[n-6]>>k&255]=a[n-6];\
case 6:*++ptr##k[a[n-5]>>k&255]=a[n-5];\
case 5:*++ptr##k[a[n-4]>>k&255]=a[n-4];\
case 4:*++ptr##k[a[n-3]>>k&255]=a[n-3];\
case 3:*++ptr##k[a[n-2]>>k&255]=a[n-2];\
case 2:*++ptr##k[a[n-1]>>k&255]=a[n-1];\
case 1:*++ptr##k[a[n=0]>>k&255]=a[n-0];\
default: break;\
}
countingSort(a,0);
countingSort(b,8);
countingSort(a,16);
countingSort(b,24);
delete[] b;
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 975.2 us | 808 KB | Accepted | Score: 34 | 显示更多 |
| Testcase #2 | 1.05 s | 762 MB + 992 KB | Accepted | Score: 33 | 显示更多 |
| Testcase #3 | 2.102 s | 1525 MB + 928 KB | Accepted | Score: 33 | 显示更多 |