package bucket;
//桶排序---计数排序
import java.util.Arrays;
//题目:给分数 0-5分的同志排序 假设 0,2,3,0,2,0,5,4,1
public class Test1 {
public static void main(String[] args) {
int[] numbers={2,5,3,0,2,3,0,3};
//数组下标代表分数 也就是0-5分
int[] bucket=new int[6];
//1.把对应的分数放到对应下标,相同分,就递增,统计相同分数的数量
for (int i = 0; i <numbers.length ; i++) {
bucket[numbers[i]]++;
}
//顺序求和,为的后面的排序方便
for (int i = 1; i <bucket.length ; i++) {
bucket[i]+=bucket[i-1];
}
//新建一个数组存储新的元素
int[] R=new int[numbers.length];
//通过数据作为索引,直接索引到顺序求和后的数组下标,此时内容存储的是前面的分数人数和当前人数总和,由此可以
//通过-1的操作来确定在新数组的下标,因为前面的元素个数决定了它的位置,最后把数据赋值进去就好了
for (int i = 0; i <numbers.length ; i++) {
R[--(bucket[numbers[i]])]=numbers[i];
}
System.out.println(Arrays.toString(bucket));
System.out.println(Arrays.toString(R));
}
}
计数排序只能用在数据范围不大的场景中,如果数据范围 k 比要排序的数据 n 大很多,就不适合用计数排序了。而且,计数排序只能给非负整数排序,如果要排序的数据是其他类型的,要将其在不改变相对大小的情况下,转化为非负整数。