基数排序

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

1. 基数排序 vs 计数排序 vs 桶排序

基数排序有两种方法:

这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:

  • 基数排序:根据键值的每位数字来分配桶;
  • 计数排序:每个桶只存储单一键值;
  • 桶排序:每个桶存储一定范围的数值;

public class RadixSort {
    public static void main(String[] args) {
        int arr[] = {53, 3, 542, 748, 14, 214};
        radixSort(arr);
    }

    public static void radixSort(int arr[]) {
        //1.得到数组中最大数的位数
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        //最大数的位数
        int maxLength = (max + "").length();


        //1.二维数组包含10个一维数组
        int bucket[][] = new int[10][arr.length];

        //为了记录每个桶中,实际存放了多少了数 定义一个一维数组来记录每个桶的每次放入的数据个数
        int bucketCount[] = new int[10];

        for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
            for (int j = 0; j < arr.length; j++) {
                int digitEle = arr[j] / n % 10;
                //放入对应的桶中
                bucket[digitEle][bucketCount[digitEle]] = arr[j];//[bucketCount[digitEle]]从0开始
                bucketCount[digitEle]++;
            }
            //按照这个桶的顺序(一维数组的下标依次取出数据 放入原来数组)
            int index = 0;
            for (int k = 0; k < 10; k++) {
                //如果桶中有数据
                //bucketCount :存放的是数据的个数
                if (bucketCount[k] != 0) {
                    for (int l = 0; l < bucketCount[k]; l++) {
                        //取出元素放到arr
                        arr[index++] = bucket[k][l];
                    }
                }
                //清空
                bucketCount[k] = 0;
            }
            System.out.println("第" + (i + 1) + "轮的结果" + Arrays.toString(arr));
        }
    }
}

posted @ 2022-02-22 14:31  被动  阅读(35)  评论(0)    收藏  举报