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

Posted 戎·码一生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指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》:[13]对几万公司员工年龄的排序算法的主要内容,如果未能解决你的问题,请参考以下文章

中国互联网公司员工平均年龄出炉,你怎么看?我躺着看

中国互联网公司员工平均年龄出炉,你怎么看?我躺着看

中国互联网公司员工平均年龄出炉

年龄是个硬门槛!42岁,腾讯13级,985硕士,找工作三个月,居然没有一家公司接收!...

剑指offer-翻转单词顺序列

剑指offer 13:数值的整数次方