序言:在面试的时候,如果面试官要求实现一个排序算法,那么应聘者一定要问清楚这个排序应用的环境是什么、有哪些约束条件,在得到足够多的信息之后再选择最合适的排序算法,切勿盲目套用常见的排序算法,如快速排序。
题目:对公司所有员工的年龄排序。时间效率O(n)
注:向面试官询问年龄的范围,询问是否可以使用辅助空间,询问员工人数。
算法思想:利用辅助空间timesOfAge用来统计每个年龄出现的次数。某个年龄出现了多少次,就在数组ages里设置几次该年龄,这样就相当于给数组ages排序。从而通过辅助空间换来了O(n)时间效率。
输入:24,25,26,25,25,19,17
void SortAges(int ages[],int length)
{
if(ages == NULL || length <=0)
return;
const int oldestAge = 99;
int timesOfAge[oldestAge+1];
for(int i=0;i<=oldestAge;++i)
timesOfAge[i]=0;//初始化每个年龄出现次数为0
for(int i=0;i<=length;++i)
{
int age=ages[i];//age=24,25,26,25,25,19,17
if(age<0 || age>oldestAge)
throw new std::exception("age out of range");
++timesOfAge[age];//年龄24 1次; 25 三次; 26 一次 ;19 一次 ;17 一次
}
int index=0;
for(int i=0;i<=oldestAge;++i)
{
for(int j=0;j<timesOfAge[i];++j)
{
ages[index]=i;//例如:i=24 ages[0]=24; i=25 ages[1]=ages[2]=ages[3]=25
++index;
}
}}
JAVA示例
public class AgeDemo {
static int ages[]=new int[]{24,25,26,18,25,19,70,24,32,48,47};
static void SortAges(int ages[],int length) throws AgeException
{
int oldestAge = 99;
int timesOfAge[]=new int[oldestAge+1];
for(int i=0;i<=oldestAge;i++)//初始化每个年龄出现次数为0
{
timesOfAge[i]=0;
}
for(int i=0;i<length;i++)//记录年龄出现次数
{
int age=ages[i];//age=24,25,26,25,25,19,17
if(age<0 || age>oldestAge)
{
throw new AgeException();
}
++timesOfAge[age];//年龄24 1次; 25 三次; 26 一次 ;19 一次 ;17 一次
}
int index=0;
for(int i=0;i<=oldestAge;i++)
{
for(int j=0;j<timesOfAge[i];j++)
{
ages[index]=i;//ages[0]=19;ages[1]=24;ages[2]=ages[3]=ages[4]=25;ages[6]=26;ages[7]=70
index++;
}
}
}
static void display(int ages[])
{
for(int i=0;i<ages.length;i++){
System.out.print(ages[i]+":");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
SortAges(ages,ages.length);
} catch (AgeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
display(ages);
}
}