(八)基数排序
实现代码:
/*!
* 十进制基数排序
*/
double RadixSort(int *data, int size)
{
double res = 0;
int tmp;
//EClock<> Ek;
int max = data[0];
int min = data[0];
for(int i=1; i<size; i++)
{
if(max < data[i])
{
max = data[i];
}
if(min > data[i])
{
min = data[i];
}
}
if(min < 0)
{
for(int i=1; i<size; i++)
{
data[i] -= min;
}
}
boost::scoped_array<int> temp(new int[size]);
for(int i=0; i<size; i++) temp[i] = 0;
min < 0 ? (max = max - min) : (max = max);
int bary[10];
int base = 10;
int times = 0;
tmp = max;
do{ times++; }while(tmp/=base);
tmp = 1;
int *pd = data;
int *pt = temp.get();
int *pm = 0; //printf("times = %d\n", times);
while(times--)
{
for(int i=0; i<10; i++)
bary[i] = 0;
for(int i=0; i<size; i++)
bary[(pd[i]/tmp)%10] += 1;
for(int i=1; i<10; i++)
bary[i] += bary[i-1];
for(int i=size-1; i>=0; i--)
{
pt[--bary[(pd[i]/tmp)%10]] = pd[i];
}
pm = pd;
pd = pt;
pt = pm;
break;
tmp *= 10;
}
if(pd != data)
{
for(int i=0; i<size; i++)
{
data[i] = pd[i];
}
}
if(min < 0)
{
for(int i=0; i<size; i++)
{
data[i] = data[i] - min;
}
}
//res = Ek.microsecond();
return res;
}
测试结果:
10 | 0.90561 |
20 | 0.60374 |
50 | 1.20748 |
100 | 3.924309 |
200 | 3.320569 |
500 | 6.037399 |
1000 | 10.86732 |
2000 | 25.35707 |
3000 | 45.58236 |
4000 | 33.20569 |
5000 | 62.18521 |
6000 | 54.94033 |
7000 | 59.46838 |
8000 | 75.46748 |
9000 | 69.43008 |
10000 | 80.2974 |
20000 | 157.878 |
50000 | 456.4273 |
100000 | 856.7069 |
200000 | 1908.422 |
500000 | 6691.551 |
800000 | 8998.139 |
1000000 | 10912.9 |