基数排序

原理

基数排序的思想其实挺有意思,举个栗子来说,有如下数组:
这里写图片描述

第一趟:

我们首先对这个数组按照其个位数进行分组,结果如下:
这里写图片描述
然后将分组后的数据按照索引的大小取出,得到新的数组如下:
这里写图片描述
第一趟排序后完成的工作为将数组按照个位数由小到大的顺序进行了排序

第二趟:

对第一趟的结果按照十位数进行分组,结果如下:
这里写图片描述
然后将分组后的数组按照索引的大小分别取出,得到新的数组如下:
这里写图片描述
第二趟排序后完成的工作是将数组按照十位数由小到大进行了排序,同时由于个位数已经进行了排序,因此将分组后的数组按照索引大小取出时,十位数相同的较小的会排在前面,如31和38,43和49

第三趟:

对第二趟的结果按照百位数进行分组,结果如下:
这里写图片描述
然后将分组后的数组按照索引的大小分别取出,得到新的数组如下:
这里写图片描述
第三趟排序后完成的工作是将数组按照百位数由小到大进行了排序,同时由于个位数和十位数都已经进行了排序,所以较小的数会排在前面

这样就完成了整个数组的排序.

由上面的过程可以知道如果最大数有n位,则需要n次(按照索引分组+按照索引大小取出数据)

两个小前提:

1.下面写的算法是对全为正整数的数组进行排序
2.该算法必须要先知道这个数组中最大值得位数,如999是3位

算法:(感觉该博客写的挺好的,所以这里用了人家的算法https://www.cnblogs.com/haozhengfei/p/29ba40edbf659f2dbc6b429c2818c594.html)

package com.nrsc.sort;

public class RadixSort {
    public static void main(String[] args) {
        int[] arr = { 49, 38, 65, 97, 23, 22, 76, 1, 5, 8, 2, 0, 22, 100, 101 };
        radixSort(arr);
        System.out.println("排序后:");
        for (int i : arr) {
            System.out.println(i);
        }
    }

    public static void radixSort(int[] arr) {
        // 查找数组中的最大值
        int max = arr[0];
        for (int i = 1; i < arr.length - 1; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        // 计算最大值的位数
        int maxDigit = 0;
        while (max > 0) {
            max /= 10;
            maxDigit++;
        }

        int length = arr.length;
        int divisor = 1;// 定义每一轮的除数,1,10,100...
        // 定义了10个桶,为了防止每一位都一样所以将每个桶的长度设为最大,与原数组大小相同
        int[][] bucket = new int[10][length];
        int[] count = new int[10];// 统计每个桶中实际存放的元素个数

        int digit;// 获取元素中对应位上的数字,即装入那个桶
        for (int i = 1; i <= maxDigit; i++) {// 经过maxDigit+1次装通操作,排序完成
            for (int temp : arr) {// 计算入桶
                digit = (temp / divisor) % 10;
                bucket[digit][count[digit]++] = temp;
            }
            int k = 0;// 被排序数组的下标
            for (int b = 0; b < 10; b++) {// 从0到9号桶按照顺序取出
                if (count[b] == 0)// 如果这个桶中没有元素放入,那么跳过
                    continue;
                for (int w = 0; w < count[b]; w++) {
                    arr[k++] = bucket[b][w];
                }
                count[b] = 0;// 桶中的元素已经全部取出,计数器归零
            }
            divisor *= 10;
        }
    }
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值