java 实现基数排序

基数排序

将数组中的每个数分别按个位、十位、百位…进行排序。

获取数中的每一位

public static void main(String[] args){
    
    
        int number = 23456;
        int bit;

        // 个位
        System.out.print("该数的个位:");
        bit = number % 10;
        System.out.println(bit);

        // 十位
        System.out.print("该数的十位:");
        bit = number / 10 % 10;
        System.out.println(bit);

        // 百位
        System.out.print("该数的百位:");
        bit = number / 100 % 10;
        System.out.println(bit);

        // 千位
        System.out.print("该数的千位:");
        bit = number / 1000 % 10;
        System.out.println(bit);

        // 万位
        System.out.print("该数的万位:");
        bit = number  / 10000 % 10;
        System.out.println(bit);
}
该数的个位:6
该数的十位:5
该数的百位:4
该数的千位:3
该数的万位:2

基本实现

// 基数排序
public class RadixSort {
    
    
    // 排序
    public int[] sort(int[] array){
    
    
        if(array.length == 0)
            return null;
        //找到最大值的位数
        int maxBit = 1;
        int number = 10; // 10,100,1000...
        for(int i = 0;i < array.length;i ++){
    
    
            if(array[i] >= number){
    
    
                number = number * 10;
                maxBit ++;
            }
        }
        System.out.println("最大值的位数:" + maxBit);
        return sort(maxBit,array);
    }

    // 实现排序
    // 传入最大值的位数,要排序的数组
    private int[] sort(int maxBit,int[] array) {
    
    
        // 创建二维数组来储存每次得到的数
        int[][] arrays = new int[10][array.length]; // 二维数组里创建十个数组,长度为要排序数组长度
        int[] numberes; // 记录二维数组中每个数组内的个数
        // 排个位
        numberes = new int[10];
        int bit;  // 取余得到的数
        for (int i = 0; i < array.length; i++) {
    
    
            // 拿到每个数的个位
            bit = array[i] % 10; // 取余
            // 将排序数组中的数添加到二维数组中相应的位置
            arrays[bit][numberes[bit]] = array[i];
            // 个数加1
            numberes[bit]++;
        }
        // 得到新数组
        int index = 0; // 排序数组的索引
        for (int i = 0; i < 10; i++) {
    
    
            for (int j = 0; j < numberes[i]; j++) {
    
    
                array[index] = arrays[i][j];
                index++;
            }
        }
        System.out.println("第一次排序:");
        for (int i = 0; i < array.length; i++) {
    
    
            System.out.print(array[i] + "  ");
        }
        System.out.println();

        // 排十位
        numberes = new int[10];
        int s_bit;
        for (int i = 0; i < array.length; i++) {
    
    
            s_bit = (array[i] / 10) % 10;
            arrays[s_bit][numberes[s_bit]] = array[i];
            numberes[s_bit]++;
        }
        int s_index = 0;
        for (int i = 0; i < 10; i++) {
    
    
            for (int j = 0; j < numberes[i]; j++) {
    
    
                array[s_index] = arrays[i][j];
                s_index++;
            }
        }
        System.out.println("第二次排序:");
        for (int i = 0; i < array.length; i++) {
    
    
            System.out.print(array[i] + "  ");
        }
        System.out.println();
        
        // 第三次排序
        numberes = new int[10];
        int t_bit;
        for (int i = 0; i < array.length; i++) {
    
    
            t_bit = (array[i] / 100) % 10;
            arrays[t_bit][numberes[t_bit]] = array[i];
            numberes[t_bit]++;
        }
        int t_index = 0;
        for (int i = 0; i < 10; i++) {
    
    
            for (int j = 0; j < numberes[i]; j++) {
    
    
                array[t_index] = arrays[i][j];
                t_index++;
            }
        }
        System.out.println("第三次排序:");
        for (int i = 0; i < array.length; i++) {
    
    
            System.out.print(array[i] + "  ");
        }
        System.out.println();
        
        return array;
    }
}

测试类

// 测试类
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        int[] array = new int[]{
    
    10,2,9,121,28,56,88,137};
        RadixSort sort = new RadixSort();
        array = sort.sort(array);
        System.out.println();
        System.out.println("排好序的数组:");
        for(int i : array){
    
    
            System.out.print(i + "  ");
        }
    }
}

结果

最大值的位数:3
第一次排序:
10  121  2  56  137  28  88  9  
第二次排序:
2  9  10  121  28  137  56  88  
第三次排序:
2  9  10  28  56  88  121  137  
排好序的数组:
2  9  10  28  56  88  121  137    

优化

// 基数排序
public class RadixSort {
    
    
    // 排序
    public int[] sort(int[] array){
    
    
        if(array.length == 0)
            return null;
        //找到最大值的位数
        int maxBit = 1;
        int number = 10;
        for(int i = 0;i < array.length;i ++){
    
    
            if(array[i] >= number){
    
    
                number = number * 10;
                maxBit ++;
            }
        }
        System.out.println("最大值的位数:" + maxBit);
        return sort(maxBit,array);
    }

    // 实现排序
    private int[] sort(int maxBit,int[] array){
    
    
        // 二维数组储存每次得到的数
        // 创建二维数组来储存每次得到的数
        int[][] arrays = new int[10][array.length]; // 二维数组里创建十个数组,长度为要排序数组长度
        int[] numberes; // 记录二维数组中每个数组内的个数
        int bit; // 每次取余得到的数
        int index; // 排序数组的索引
        int flag = 0;  // 如果是排个位
        int num = 1; 
        while(flag < maxBit){
    
    
            if(flag == 0)
                num = 1;
            else
                num = num * 10;
            numberes = new int[10];
            for(int i = 0;i < array.length;i ++){
    
    
                // 拿到每个数的位
                bit = (array[i] / num) % 10; // 取余
                // 添加到二维数组中
                arrays[bit][numberes[bit]] = array[i];
                // 个数加1
                numberes[bit] ++;
            }
            // 得到的新数组
            index = 0;
            for(int i = 0;i < 10;i ++){
    
    
                for(int j = 0;j < numberes[i];j ++){
    
    
                    array[index] = arrays[i][j];
                    index ++;
                }
            }
            System.out.println("第"+ flag + "次排序:");
            for(int i = 0;i < array.length;i ++){
    
    
                System.out.print(array[i] + "  ");
            }
            System.out.println();
            flag ++;
        }
        return array;
    }
}

测试类

// 测试类
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        int[] array = new int[]{
    
    99,4,0,123,567,890,1439,1374};
        RadixSort sort = new RadixSort();
        array = sort.sort(array);
        System.out.println("排好序的数组:");
        for(int i : array){
    
    
            System.out.print(i + "  ");
        }
    }
}

结果

最大值的位数:40次排序:
0  890  123  4  1374  567  99  14391次排序:
0  4  123  1439  567  1374  890  992次排序:
0  4  99  123  1374  1439  567  8903次排序:
0  4  99  123  567  890  1374  1439  
排好序的数组:
0  4  99  123  567  890  1374  1439  

猜你喜欢

转载自blog.csdn.net/weixin_46085748/article/details/124827601