题目:公司有上万名员工,在O(n)时间内将员工按照年龄排序。可以使用常量大小辅助空间。
思路分析:
需要排序的数字为年龄,年龄在一个较小的范围内,我们可以设置为[0,99]。然后遍历所有的年龄,记录下每个年龄出现的次数。再依次将这些年龄赋值给要排序的年龄数组。比如25岁的有1000个,那么就需要给年龄数组赋值1000个25.
代码:
void sortAges(int ages[], int length){
if(ages == NULL || length <= 0)
return;
const int oldestAge = 99;//允许的年龄范围为0-99
int timesOfAge[oldestAge + 1];//统计某一年龄出现的次数
for(int i = 0; i <= oldestAge; i ++){
timesOfAge[i] = 0;
}
for (int i = 0; i < length; ++i)
{
int age = ages[i];
if(age < 0 || age > oldestAge)
throw new exception("age out of range");
++ timesOfAge[age];
}
int index = 0;
for (int i = 0; i <= oldestAge; ++i)//遍历所有的年龄0-99
{
for (int i = 0; i < timesOfAge[i]; ++i)
{
ages[index] = i;
++ index;
}
}
}