对大量人的年龄排序

问题描述:

公司总共有几万名员工,对这些员工的年龄排序。要求只需用少量的辅助内存。

思路解析:

年龄总数在一个很小范围,例如0-100.这就可以用一个小数组存储了。逐个统计

年龄即可

参考代码:

void SortAge(int age[],int length)
{
    if (age == NULL || length == 0)
    {
        return;
    }

const int oldestAge = 99;
    int TimeOfAges[oldestAge+1];

for (int i = 0; i <= oldestAge;i++)
    {
        TimeOfAges[i] = 0;
    }
   
    //统计各年龄段的人数
    for (int i = 0;i < length;i++)
    {
        if (age[i] < 0 || age[i] > oldestAge)
        {
            throw new exception("age out of range");
        }
        ++TimeOfAges[age[i]];
    }

//在原数组中根据统计到人数将数组重新排序
    //比如年龄最小的20岁有33个人,那么原数组前二十三个元素的值被置为20
    //以此类推这样整个数组就排序好了
    int index = 0;
    for (int i = 0;i <= oldestAge;i++)
    {
        for (int j = 0;j < TimeOfAges[i];j++)
        {
            age[index] = i;
            ++index;
        }
    }
}

时间: 2024-10-13 17:07:25

对大量人的年龄排序的相关文章

O(N)时间的排序

题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间. 要注意分析题目,一般排序要么是O(n^2),要么是O(nlogn).但这里题目特别强调是对一个公司的员工的年龄作排序.员工的数目虽然有几万人,但这几万员工的年龄却只有几十种可能.上班早的人一般也要等到将近二十岁才上班,一般人再晚到了六七十岁也不得不退休. 由于年龄总共只有几十种可能,我们可以很方便地统计出每一个年龄里有多少名员工.举个简单的例子,假设总共有5个员工,他们的年龄分别是

计数排序(counting_sort) 算法分析

线性时间排序的一种(时间复杂度为(n)) 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置. 计数排序的特征 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法. 由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序

oc72--NSArray排序

// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, assign) int age; @end // Person.m #import "Person.h" @implementation Person - (NSString *)description { return [NSString stringWithFormat:@&qu

OC 遍历及排序

// main.m #import <Foundation/Foundation.h> #import "person.h" int main(int argc, const char * argv[]) { //数组遍历 //原理:通过for循环的循环变量?用作数组元素下标来获取不同下标的 元素. // 循环次数就是数组元素的个数.: // NSArray *cityarray=[NSArray arrayWithObjects:@"北京",@&quo

剑指offer-第二章排序之年龄排序

题目:对某个公司的人的年龄(0-99)进行排序,该公司的总人数为几万人.要求时间复杂度为O(n),可以辅助O(n)的空间. 思路:实现函数为void SortAge(int ages[],int len).辅助空间为一个整型数组timesOfAge[100],用来存放每个个年龄的人数(当满足i<len,如果age[i]<=99&&age[i]>=0时候,有timesOfAge[age[i]]++,i++).用一个嵌套的for对ages[],进行排序.外层用i来代表年龄上限

计数排序算法

计数排序(Counting sort)是一种稳定的线性时间排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置. 本文地址:http://www.cnblogs.com/archimedes/p/counting-sort-algorithm.html,转载请注明源地址. 计数排序的特征 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较

算法导论-排序(四)计数排序(线性时间排序)

目录 1.计数排序介绍 2.流程图 3.代码实现 4.性能分析 5.参考资料 内容 1.计数排序介绍 什么是计数排序? 计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为θ(nlgn);   而计数排序不需要对数进行比较就可以进行排序:很神奇吧,只需要对待排序数组进行遍历就可以排序,效率为Θ(n)..哈哈,那么神奇,下面开讲!!!! 限制:计数排序只能对非负整数(0,1,2,3...N)进行排序 排序思想:计数排序的基本思想就是对每一个输入元素 x,确定出小于 x

简单排序-病人排队

总时间限制: 1000ms 内存限制: 65536kB 描述 病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序: 1. 老年人(年龄 >= 60岁)比非老年人优先看病. 2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序. 3. 非老年人按登记的先后顺序看病. 输入 第1行,输入一个小于100的正整数,表示病人的个数:后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),

各种排序笔记

在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆排序等算法,这些算法需要对序列中的数据进行比较,因为被称为基于比较的排序. 基于比较的排序算法是不能突破O(NlogN)的.简单证明如下: N个数有N!个可能的排列情况,也就是说基于比较的排序算法的判定树有N!个叶子结点,比较次数至少为log(N!)=O(NlogN)(斯特林公式). 而非基于比较的排序,如计数排序,桶排序,和在此基础上的基