《剑指offer》2.4.2面试片段题:对公司的几万个员工年龄排序,要求时间复杂度O(n),额外空间复杂度不超过O(n)(常量级别)。
思路:类似桶排序,所有员工的年龄都在一个范围内,例如0到99,初始化一个大小为100的数组arr(数组中所有元素初始为0),遍历所有员工年龄ages,将员工年龄为0的人数放到数组的第0个位置arr[0],将员工年龄为1的人数放到数组的第1个位置arr[1]......将员工年龄为99的人数放到数组的第99个位置arr[99],遍历这个数组arr,将员工年龄(数组arr下标)排序到ages中。
代码如下:
public static void sortAge(int[] ages) {
if (ages == null || ages.length <= 1) {
return;
}
int[] arr = new int[100];
for (int i = 0;i < ages.length;i++) {
if (ages[i] < 0 || ages[i] > 99) {
throw new RuntimeException("age is out of range");
}
arr[ages[i]]++;
}
int index = 0;
for (int i = 0;i < arr.length;i++) {
for (int j = 0;j < arr[i];j++) {
ages[index++] = i;
}
}
}