基数排序

我们先按个位排,再根据十位数排,直到所有元素有序。有10个桶,分别用来存放某一位上数字为0-9的元素。找到数组中的最大值,它的位数决定了外循环次数。
把各个元素按照个位数放入对应的桶里,并用一个count[]记录每个桶里放了几个元素,全部放完以后, 把元素按顺序取出,(从第0个桶到第9个桶,每个桶里先放进去的先取出来),放到原数组里;
 再根据十位数重复上面的过程,重复的次数由最大值的位数决定,循环结束以后数组有序。

public void sort(int[] arr){
        int len = arr.length;
        int[][] bucket = new int[10][len];    //桶
        int[] count = new int[10];     //记录每个桶每次放几个数     
        int max = arr[0];             //数组中的最大值

        for (int i = 1; i < arr.length; i++){
            if (arr[i] > max){
                max = arr[i];
            }
        }

        int m = (max + "").length();
        int n = 0;
        int n1 = 1;

        while(n < m){
            for (int i = 0; i < len; i++){
                int r = arr[i] / n1 % 10;
                bucket[r][count[r]] = arr[i];
                count[r]++;
            }

            n++;
            n1 = n1 * 10;
            int k = 0;

            for (int i = 0; i < 10; i++){
                for (int j = 0; j < count[i]; j++){
                    arr[k] = bucket[i][j];
                    k++;
                }
                count[i] = 0;
            }
        }
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值