题目:对公司所有员工年龄进行排序。公司有大约几万名的员工,要求时间复杂度在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);
统计公司某个年龄出现的次数亦可借助上述方式实现。
本文介绍了一种针对公司员工年龄的排序算法,适用于几万名员工的数据规模,并确保了O(n)的时间复杂度。通过使用计数排序的方法,遍历员工年龄数组统计每个年龄出现的次数,再重新填充数组以完成排序。
982

被折叠的 条评论
为什么被折叠?



