剑指Offer--对公司人员年龄进行排序

本文介绍了一种针对公司员工年龄的排序算法,适用于几万名员工的数据规模,并确保了O(n)的时间复杂度。通过使用计数排序的方法,遍历员工年龄数组统计每个年龄出现的次数,再重新填充数组以完成排序。

题目:对公司所有员工年龄进行排序。公司有大约几万名的员工,要求时间复杂度在O(n)内,可以借助常数项的辅助空间。

代码:

public static void sortAges(int[] ages) {
		if (ages == null || ages.length <= 0) {
			throw new IllegalArgumentException("Invalid Parmeters");
		}
		int length = ages.length;
		int[] timesOfAge = new int[99 + 1];
		// 扫描整个有效范围的数组,统计每个年龄出现的次数
		for (int i = 0; i < length; i++) {
			if (ages[i] < 0 || ages[i] > 99) {
				throw new IllegalArgumentException("Invalid Parmeter");
			}
			int age = ages[i];
			++timesOfAge[age];//自增年龄出现的次数
		}
		int index = 0;//定义一个自增索引用于记录ages中的游标
		for (int i = 0; i < timesOfAge.length; i++) {
			for (int j = 0; j < timesOfAge[i]; j++) {//此处包含了所有的年龄出现的次数
				ages[index] = i;
				index++;
			}
		}
}

模拟公司人员年龄的函数:

public static int[] getAges(int length){
		if(length <=0 || length > Integer.MAX_VALUE){
			throw new IllegalArgumentException("Invalid Parmeters");
		}
		int[] ages = new int[length];
		for(int i=0;i<length;i++){
			ages[i] = (int) (Math.random() * 100);
		}
		return ages;
}

分析:人员的年龄姑且可以设定一个泛微[0-99](当然可以自己更改),我们可以遍历原年龄数组统计每一个年龄在各个点出现的次数,我们将各个点出现的次数放在一个辅助空间timesOfAges中,然后遍历timesOfAges该辅助空间的索引即是年龄,该索引处的值即是连续出现的次数。时间复杂度分析:O(n) +常数*O(n)=O(n);

统计公司某个年龄出现的次数亦可借助上述方式实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值