计数排序

计数排序(最快的排序算法)

思路

一句话:用辅助数组对目标数组中出现的数字计数,元素转下标,下标转元素

  • 假设元素均大于等于0,依次扫描原数组元素,将元素K记录在辅助数组的K位上。
  • 依次扫描辅助数组,如果为1,将其插入到目标数组的空白处
  • 计数有缺陷,数据较为密集或范围较小时,适用。

代码如下

import java.util.Arrays;
public class CountSort
{
	public static int[] sort(int[] arr)
	{
		//得到数列的最大值与最小值
		int min=arr[0];
		int max=arr[0];
		for (int i = 1; i < arr.length; i++)
		{
			if (arr[i]>max) {
				max=arr[i];
			}
			if (arr[i]<min)
			{
				min=arr[i];
			}
		}
		//2.根据最大值和最小值确定统计数组的长度
		int range=max-min+1;//要开辟的数组范围
		int[] count=new int[range];
	    //3.遍历数列,计算统计对应元素个数
		for (int i = 0; i < arr.length; i++)
		{
			count[arr[i]-min]++;
		}
	    //4.遍历统计数组,输出结果
		int index=0;
		int[] sortArray=new int[arr.length];
		for (int i = 0; i < count.length; i++)
		{
			while(count[i]>0) {
				sortArray[index++]=i+min;
				count[i]--;
			}
		}
		return sortArray;
		
	}
	public static void main(String[] args)
	{
		 int[] arr={1,5,6,8,-5,-9,-1,10};
		 //sort(arr);
		 System.out.println(Arrays.toString(sort(arr)));
	}
}

代码优势:
  • 以上代码先找到目标数组的最大值与最小值,建立(最大值-最小值+1)大小的数组,这样可以尽可能缩小使用空间。
  • 这个代码对负数也适用,通过将每个元素进行转换(用每个元素减去该数组中的最小值

应用实例

公司现在要对几万员工的年龄进行排序,因为公司员工的人数非常多,所以要求排序算法的效率要非常高,你能写出这样的程序吗!
输入:输入可能包含多个测试样例,对于 每个测试案例

  • 输入的第一行为一个整数n(1<=n<=100000):代表公司内员工的人数。
  • 输入的第二行包括n个整数:代表公司每个员工的年龄。其中,员工年龄 age的取值范围为(1<=age<=99)。

输出:对每个测试案例,
请输出排序后的n个员工的年龄,每个年龄后面有一个空格。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sparky*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值