《剑指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]对几万公司员工年龄的排序算法的主要内容,如果未能解决你的问题,请参考以下文章