《剑指offer》:[13]对几万公司员工年龄的排序算法

   请实现一个排序算法,对一个公司的员工(几万)进行排序。要求其时间复杂度为O(N).可以使用常量的辅助空间,不能超过O(N)。
   其实这个问题很常规,但是为什么我要写出来,主要是因为有几点是值得我们注意的,方法也比较新颖。
   首先我们要明确一点,那就是几万人的年龄,根据鸽巢原理,若按最大年龄为100岁来算(不排除有>100的,终身荣誉主席,顾问什么的,但是这里我们假设没有100岁的,不然也太残忍了),至少有几百个人的年龄是相同的。也就是说数据的重复率相当的高。如果用快速和堆还有其他的排序,若不限制内存,最好的时间复杂度也是O(N*logN)。这里要求为O(N)所以我们就要想办法了,因为可以用常量的辅助空间,所以我们可以用空间来换取时间。
具体实现代码如下:
void SortAge(int *age,int length)
{
    if(NULL==age || length<=0)
    return;
    const int oldestage=100;
    int timesOfAge[oldestage];  //辅助空间;
    for(int i=0;i<oldestage;i++)
    {
       timesOfAge[i]=0;  //初始化;
    }
    for(int i=0;i<oldestage;i++)
    {
       int age=age[i];
       if(age<=0 || age>=100)
       return ;
       timeOfAge[age]++;
    }
    int index=0;
    for(int i=0;i<oldest;i++)
       for(int j=0;j<timesOfAge[i];j++)  
       {
          age[index]=i;
	  index++;
       }
}
   数组timesOfAge用来统计每个年龄出现的次数。某个年龄出现了多少次,就在数组ages里设置几次该年龄,这样就相当于给数组age排序了。利用100个整数数组作为辅助空间换来了O(n)的效率。

你可能感兴趣的:(排序算法,剑指offer,员工年龄)