对公司所有员工的年龄进行排序,公司总共有几万名员工,要求时间复杂度为O(n)。
很明显的计数排序题目,员工的年龄肯定在一个范围之内,我们这里假设在0-99之内,算很大了,这样就可以开辟一个长度为100的数组,保存各个年龄的员工的个数。
代码如下:
package jzoffer;
public class AgeSort {
public static void main(String[] args) {
int [] a = {51,2,6,8,9,5,7,8,9,4,5,6,1,4,7,51,48,47,46,64};
System.out.println("-----开始记录如下-----");
printList(a);
System.out.println("");
System.out.println("-----排序结果如下-----");
ageSort(a);
}
public static void ageSort(int[] args){
int [] countAge = new int[100];
if(args == null || args.length <= 0 ){ //特殊性检验
System.out.println("数组为空!!!");
return;
}
for(int i=0;i<args.length;i++){
if(args[i]<0 || args[i]>99){
System.out.println("数组中存在非法年龄!");
return;
}
}
for(int i = 0;i<args.length;i++){
countAge[args[i]]++; //遍历传进来的args数组,然后将几岁的存入下标为几的格子里,
} //然后几岁的有几个人,格子里的数就加几
int curIndex = 0;
for(int i = 0;i<countAge.length;i++){//遍历count数组,如果下标为几有n个就是,几岁的员工有n个
for(int j = 0;j<countAge[i];j++){//然后每次遍历一个格子,要把格子里的数拿到给arg插入几个人
args[curIndex] = i; //就这样我们就可以将他们有序排列了
curIndex++;
}
}
printList(args);
}
public static void printList(int [] a){ //写一个输出模块函数
for(int i =0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}