对公司几万名员工按年龄排序(时间复杂度为O(N))

20人阅读 评论(1) 收藏 举报
分类:

【0】 目录

【1】题目
【2】分析
【3】测试代码
【4】测试结果

【1】题目:

面试官: 请实现一个排序算法,要求时间复杂度为O(N)
应聘者:请问对什么数字进行排序,共有多少数字?
面试官:我们想对公司所有员工按年龄排序,我们公司共有几万名员工;
应聘者:也就是说数字的大小在一个较小的范围之内,对吗?
面试官:是的
应聘者:可以使用辅助空间吗?
面试官:看你用多少内存,只允许使用常量大小的辅助空间,不得超过O(N);
应聘者:好的,我知道了;,

【2】分析:

通过面试官的要求,我们可以确定的是,是要求在一个有限范围内排序,并且实现效率为O(N),那么我们可以将员工年纪设置在0~99范围内,借助一个辅助空间,可以是一个数组,用来保存从0到99岁这100个年龄出现的次数,某个年纪每出现一次,就给对应下标的空间加1,然后再根据这个数组中记录的次数,确定该年纪在原数组中相应出现多少次;

【3】测试实现:

#include<iostream>
using namespace std;
//=====================================算法==========================================
int sortage(int ages[], int length)
{
    if(ages == NULL || length <= 0)
    {
        printf("参数传递错误:ages == NULL || length <= 0\n");
            return -1;
    }

    const int oldestage = 99;
    int timesofage[oldestage + 1];

    for (int i =0 ; i<= oldestage ; ++i)
        timesofage[i] = 0;

    for(int i = 0; i< length; ++i )
    {
        int age = ages[i];
        if(age <= 0 ||age >oldestage )
            {
                printf("年纪不在有效范围内\n");
                return -1;
              }

        ++timesofage[age];
    }

    int index = 0;
    for(int i = 0; i< oldestage ;++i )
    {
        for(int j = 0; j<timesofage[i]; ++j )
        {
            ages[index] = i;
            ++index;
        }
    }
    return 0;
}
//==================================测试代码=====================================
void test()
{
    int arr[20]={20,30,44,32,22,34,66,77,55,44,31,22,44,32,44,65,24,22,20, 35};
    int length = sizeof(arr)/sizeof(arr[0]);
    printf("共有%d位员工年纪待排序\n",length );
    int ret = sortage(arr,length);
    if(ret == 0)
    {
        printf("排序后:");
        for(int i = 0;i<length ; ++i )
        {
            printf("%d ",arr[i]);
        }
        printf("\n");
    }
}

int main()
{
    test();
    return 0;
}

【4】测试结果如下:

这里已20位员工为例:
1、ages[20] = {20,30,44,32,22,34,66,77,55,44,31,22,44,32,44,65,24,22,20, 35}
这里写图片描述
2、ages[20] = {100,30,44,32,22,34,66,77,55,44,31,22,44,32,44,65,24,22,20, 35}
这里写图片描述

3、int ret = sortage( NULL , length);
这里写图片描述

3、int ret = sortage( arr , 0);
这里写图片描述

查看评论

数据结构基础系列(9):排序

数据结构课程是计算机类专业的专业基础课程,在IT人才培养中,起着重要的作用。课程按照大学计算机类专业课程大纲的要求,安排教学内容,满足需要系统学习数据结构的人。系列课程包含11个部分,本课为第9部分排序,介绍插入排序、交换排序、选择排序、归并排序、基数排序等各种排序算法,以及各种算法的性能分析。
  • 2015年11月25日 22:02

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

转载自:http://zhedahht.blog.163.com/blog/static/25411174201131184017844/ 分析:排序是面试时经常被提及的一类题目,我们也熟悉...
  • chenjun5845209
  • chenjun5845209
  • 2012-10-11 20:57:17
  • 2669

对公司员工年龄进行排序,java实现

要求:对公司的员工年龄进行排序,员工人数大约万名左右,可使用常量大小的辅助空间,要求时间效率为O(n)。 实现思路:使用一个额外的辅助数组用来记录同龄的员工数目。 实现如下: public st...
  • a1247529789
  • a1247529789
  • 2016-04-17 16:58:31
  • 474

排序算法--对公司员工年龄的排序

/* .................................//排序算法--对公司员工的年龄排序,要求时间效率O(n) 解题思路: 公司员工的年龄有一个范围 这里规定0~99 ...
  • liyf__88
  • liyf__88
  • 2017-05-19 16:37:42
  • 733

公司员工年龄的排序,时间效率为O(n)

/* 实现一个排序算法,对某公司员工年龄进行排序,要求时间效率为O(n)。 可以使用辅助空间。只允许使用常量大小辅助空间,不得超过O(n)。 */ #include using names...
  • walkerkalr
  • walkerkalr
  • 2014-03-05 14:35:32
  • 1046

一道排序笔试题,在o(n)时间内对一个数组进行排序

题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。 分析:估计有很多人应该都看过这个题目,仅仅作为自己面试找工作的一个记录哈,大家见笑...
  • chenhange
  • chenhange
  • 2015-10-10 20:15:06
  • 466

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

请实现一个排序算法,对一个公司的员工(几万)进行排序。要求其时间复杂度为O(N).可以使用常量的辅助空间,不能超过O(N)。 其实这个问题很常规,但是为什么我要写出来,主要是因为有几点是值得我们...
  • gogoky
  • gogoky
  • 2016-06-03 19:32:06
  • 936

剑指offer——年龄排序问题

题目:对某公司所有员工的年龄进行排序,要求时间复杂度为O(n) 分析:         在已有的排序算法中,性能最好的是快速排序,但是他在最好的情况下时间复杂度只能达到O(nlogn),无法满足本...
  • u010425776
  • u010425776
  • 2016-03-06 16:17:41
  • 1171

【剑指offer】员工年龄排序

对公司所有员工的年龄进行排序,公司总共有几万名员工,要求时间复杂度为O(n)。 很明显的计数排序题目,员工的年龄肯定在一个范围之内,我们这里假设在0-99之内,算很大了,这样就可以开辟一个长...
  • mmc_maodun
  • mmc_maodun
  • 2014-05-07 12:21:12
  • 3382

面试训练O(n)时间的排序

题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。 思路:归并,快排,插入,等排序最快为o(nlgn)的时间复杂度     ...
  • hiphopmattshi
  • hiphopmattshi
  • 2012-08-31 15:24:30
  • 2128
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 1205
    排名: 4万+
    最新评论