员工年龄排序之桶排序
我也不知道今天这题目纠结半天我在纠结个啥,题目要求对一个公司所有员工的年龄排序,只能申请O(n)大小的辅助空间。然后看到题目里面的解法大致思路是利用辅助空间记录各个年龄的出现次数,然后接下来的代码硬是读了半天。
1 int index=0; 2 for(int i=0;i<=oldestAge;i++){ 3 for(int j=0;j<timesOfAge[i];j++){ 4 age[index]=i; 5 index++; 6 } 7 }
之前看到题目后的意思是对公司的员工年龄排序,比如{59,25,23,46,32,15,65,26,22,33,20,28,59,23,24,23,23,32,59,59},然后排序按照年龄出现的次数进行排序,既是把各个员工的年龄放入1-100的桶中后,按照桶的从高到低的顺序依次向下排列。所以一直没有理解这代码的意思。
然后在网上具体看了桶排序的结果后,原来最终的结果并不是如此。它就相当于把原来乱序输入的一组数放入桶里面后,每个桶都是相同大小的数,然后按照桶的编号,从小到大依次对桶里面的数进行放出(桶里面有几个数就放多少个相同的数),这样依次出来的就是顺序的数组。
理解这个意思之后,就可以理解上面的代码。首先是oldestOfAge是最大的年龄范围,然后timesOfAges是各个年龄的出现次数,即作为桶。接下来,index=0开始,对于每个数开始,都访问它在timesOfAges中对应的出现的次数,它有多少次,就对当前的index写入age数组中。index就是表示位置,比如对于上述的数组中{59,25,23,46,32,15,65,26,22,33,20,28,59,23,24,23,23,32,59,59},当index=0,i=15时,此时的timesOfAges[15]=1,则age[0]=15;然后index++,i=16,继续向下。对于23出现多次,则在数组中也就令不同的index等于23,只要记者age存放的不是每个年龄出现多少次,而是对应的年龄应该在的索引是哪一个。
1 public class test { 2 public static void sortAges(int[] ages) throws Exception{ 3 if(ages==null){ 4 return; 5 } 6 int oldestAge=99; 7 int[] timesOfAges=new int[oldestAge+1]; 8 for(int i=0;i<oldestAge;i++){ 9 timesOfAges[i]=0; 10 } 11 for(int i:ages){ 12 if(i<=0 || i>oldestAge){ 13 throw new Exception("age out of range"); 14 } 15 timesOfAges[i]++; 16 } 17 18 int index=0; 19 for(int i=0;i<=oldestAge;i++){ 20 for(int j=0;j<timesOfAges[i];j++){ 21 ages[index++]=i; 22 } 23 } 24 25 }
真正的理解题目的意图是入口关键呐。