程序员面试题精选100题(57)-O(n)时间的排序

程序员面试题精选100题(57)-O(n)时间的排序

题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。

      分析:排序是面试时经常被提及的一类题目,我们也熟悉其中很多种算法,诸如插入排序、归并排序、冒泡排序,快速排序等等。这些排序的算法,要么是O(n2)的,要么是O(nlogn)的。可是这道题竟然要求是O(n)的,这里面到底有什么玄机呢?

                题目特别强调是对一个公司的员工的年龄作排序。员工的数目虽然有几万人,但这几万员工的年龄却只有几十种可能。上班早的人一般也要等到将近二十岁才上班,一般人再晚到了六七十岁也不得不退休。

                由于年龄总共只有几十种可能,我们可以很方便地统计出每一个年龄里有多少名员工。举个简单的例子,假设总共有5个员工,他们的年龄分别是2524262425。我们统计出他们的年龄,24岁的有两个,25岁的也有两个,26岁的一个。那么我们根据年龄排序的结果就是:2424252526,即在表示年龄的数组里写出两个24、两个25和一个26

代码如下:
#include<iostream>
#include<cstdio>
#include<exception>
using namespace std;

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<=99;i++)
 timesOfAge[i]=0;
  for(int j=0;j<length;j++)
  {
    int age=ages[j];
if(ages<0||age>oldestAge)
throw new std::exception("age out of range.");
++timesOfAge[age];
  }
  int index=0;
  for(int k=0;k<=oldestAge;k++)
  {
    for(int t=0;t<timesOfAge[k];++t)
{
 ages[index]=k;
 ++index;
}
  }
  for(int q=0;q<length;q++)
  {
     cout<<ages[q]<<endl;
  }
}

int main()
{
int ages[]={25,25,26,24,25};
    SortAges(ages,sizeof(ages)/sizeof(ages[0]));
return 0;
}

参考来源:《剑指offer名企面试官精讲典型编程题》——何海涛

你可能感兴趣的:(程序员面试题精选100题(57)-O(n)时间的排序)