首页 > 技术文章 > 基数排序

fkPrograming 2021-03-13 15:46 原文

基数排序

基本思想:

将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

图文说明:

将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序。

代码实现

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();


        //定义一个二维数组,表示10个桶,每个桶就是一个一维数组
        //说明
        //1.二维数组包含10个一维数组
        //2.为了防止再放入数的时候,数据溢出,每个桶的大小定为arr.length
        int[][] bucket = new int[10][arr.length];

        //为了记录每个桶中,实际存放了多少个数
        //我们定义一个一维数组来记录各个桶每次放入数据的个数,同时也代表下一个放入对应桶中的索引
        //bucketElementCount[0] 就是记录的 bucket[0] 桶中的数据个数
        int[] bucketElementCount = new int[10];

        //用循环将代码处理
        for (int k = 0, n = 1; k < maxLength; k++, n *= 10) {
            //针对每个元素的对应位进行排序处理,第一次是个位,第二次是十位
            for (int i = 0; i < arr.length; i++) {
                //取出每个元素对应位的值
                int digitOfElement = arr[i] / n % 10;
                //放入到对应的桶中
                bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[i];
                //更新对应桶中元素的个数
                bucketElementCount[digitOfElement]++;
            }

            int index = 0;//记录从桶取出数放入原始数组的当前索引
            //将桶中的数取出放入原始数组
            for (int i = 0; i < bucketElementCount.length; i++) {
                //如果桶中有数据才放入原数组
                if (bucketElementCount[i] > 0) {
                    //循环第i个一维数组,放入
                    for (int j = 0; j < bucketElementCount[i]; j++) {
                        //取出元素放入到arr
                        arr[index++] = bucket[i][j];

                    }
                    //取完对应桶中所有数后,将记录对应桶数据个数的值清0
                    bucketElementCount[i] = 0;
                }
            }
        }
}

推荐阅读