排序算法-桶排序(计数排序)


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 大很多,就不适合用计数排序了。而且,计数排序只能给非负整数排序,如果要排序的数据是其他类型的,要将其在不改变相对大小的情况下,转化为非负整数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值