八大排序之桶排序

桶排序

在这里插入图片描述
因为一个十进制数,个位或者十位或者百位或者…上的可能取值有十种情况,分别是0~9,所以有10个桶,每个桶里面之所有分8层,是因为上面的例子有8个数需要排序

第一轮后:
在这里插入图片描述
第一轮是根据个位数的值放入桶的。然后再按从左到右,从上到下的顺序把桶里的值依次赋值到原数组中,得:210,100,200,10,23,326,8,99

第二轮:
在这里插入图片描述
第三轮:
在这里插入图片描述
至此已经排序完毕

public static void Bucketsort(int[] arr){

        //十进制即十个桶
        int[][] bucket = new int[10][arr.length];
        //十个指针,用来记录每个桶当前装了多少个数字
        int[] bucketPointer = new int[10];

        //需要找出原数组值最大的数
        int max = arr[0];
        for (int i=0;i<arr.length;i++){
            if (arr[i]>max){
                max=arr[i];
            }
        }
        //获取最大值的位数
        int maxlenth = (max+"").length();

        //3、依次循环maxlenth次,
        for (int i=0,n=1;i<maxlenth;i++,n*=10){

            // 把数组中的值,根据个位数或者十位数或者百位数....放入桶中
            for (int j=0;j<arr.length;j++){
                int digital = arr[j] / n %10; //digital用来记录当前数的个位数、十位数...的值
                bucket[digital][bucketPointer[digital]]=arr[j];//根据值不同,放入到不同的桶中
                bucketPointer[digital]++;//记录每个桶当前装有几个数
            }

            int index = 0;
            //放完之后, 遍历每个桶并且把桶中的数据依次放入到原数组里
            for (int k=0;k<bucketPointer.length;k++){
                //只要桶里有数据
                if (bucketPointer[k]!=0){
                    for (int l = 0;l<bucketPointer[k];l++){
                        arr[index]=bucket[k][l];
                        index++;
                    }
                }
                //每一轮后记得把指针的值清空
                bucketPointer[k]=0;
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值