(七)计数排序
实现代码:
/*!
* 计数排序,样本中不能出现负数
*/
double CountingSort(int *data, int size)
{
double res = 0;
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];
}
}
min < 0 ? (max = max - min + 1) : (max += 1);
boost::scoped_array<int> temp(new int[max]);
EClock<> Ek;
for(int i=0; i<max; i++)
{
temp[i] = 0;
}
for(int i=0; i<size; i++)
{
temp[(min < 0 ? (data[i]-min) : data[i])] += 1;
}
for(int i=1; i<max; i++)
{
temp[i] += temp[i-1];
}
for(int i=max-1; i>0; i--)
{
while(temp[i]-temp[i-1]>0)data[--temp[i]] = min < 0 ? (i+min) : i;
}
while(temp[0]>0)data[--temp[0]] = min < 0 ? (0+min) : 0;
printf("\n");
res = Ek.microsecond();
return res;
}
测试结果:
单位:us
10 | 4665.702 |
20 | 3945.44 |
50 | 4399.754 |
100 | 5793.186 |
200 | 3714.811 |
500 | 4270.554 |
1000 | 4549.18 |
2000 | 6373.682 |
3000 | 4905.99 |
4000 | 4077.961 |
5000 | 3994.041 |
6000 | 4006.116 |
7000 | 4094.564 |
8000 | 4416.055 |
9000 | 4320.664 |
10000 | 4615.289 |
20000 | 4583.593 |
50000 | 5475.317 |
100000 | 6293.988 |
200000 | 10395.8 |
500000 | 20353.28 |
800000 | 20064.39 |
1000000 | 21690.86 |