计数排序(最快的排序算法)
思路
一句话:用辅助数组对目标数组中出现的数字计数,元素转下标,下标转元素
- 假设元素均大于等于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个员工的年龄,每个年龄后面有一个空格。