面试的时候经常问到这种排序问题
对公司的员工按照年龄大小进行排序,员工人数上万,可以使用常数时间的辅助空间,并且要求时间复杂度控制在O(n)
显然,这种大数据的排序是不能用常见的排序算法的,时间复杂度是达不到O(n)的
既然可以使用辅助空间,最容易想到的,有如下思路:
- 先遍历员工年龄数组
- 然后在辅助数组中在年龄对应的位置存储这个年龄出现的次数
- 而且员工的年龄一定在一个范围内,比如20岁-80岁
- 最后通过年龄遍历辅助数组,对年龄数组排序并重新赋值
import java.util.Arrays;
/**
* Created by wsw on 2019/9/16 08:22
* 对公司员工年龄从小到大排序
*/
public class AgeSort {
public void ageSort(int[] ages){
int length = ages.length;
int youngAge = 20;
int oldAge = 80;
int[] tempAges = new int[oldAge + 1];
for (int i = 0; i < length; i++) {
int j = ages[i];
tempAges[j]++;
}
int index = 0;
for (int i = youngAge; i <= oldAge; i++) {
for (int j = 0; j < tempAges[i]; j++) {
ages[index] = i;
index++;
}
}
}
public static void main(String[] args) {
int[] ages = {30, 25, 28, 40, 67, 21, 21, 59, 64};
System.out.println(Arrays.toString(ages));
AgeSort ageSort = new AgeSort();
ageSort.ageSort(ages);
System.out.println(Arrays.toString(ages));
}
}
输出:
[30, 25, 28, 40, 67, 21, 21, 59, 64]
[21, 21, 25, 28, 30, 40, 59, 64, 67]
Process finished with exit code 0