对公司员工按年龄大小排序

面试的时候经常问到这种排序问题

对公司的员工按照年龄大小进行排序,员工人数上万,可以使用常数时间的辅助空间,并且要求时间复杂度控制在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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值