基数排序java实现

import java.util.Arrays;

/**
 * @author mccrea
 * @version 1.0
 * @description: 基数排序
 * @date 2020/9/20 16:03
 */
public class RadixSort {

    public static void main(String[] args) {
        int[] arr = new int[]{23,12,543,56,24,987};
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * @description:  基数排序(只针对正数)
     * @param:
     * @param arr 待排序数组
     * @return: void
     * @author mccrea
     * @date: 2020/9/20 16:04
     */
    public static void radixSort(int[] arr) {
        // 桶的个数
        int bucketCount = 10;
        // 先找出最大值
        int max = arr[0];
        for (int value : arr) {
            if (value > max) {
                max = value;
            }
        }
        // 最大值位数
        int maxLength = (max + "").length();
        // 桶数组
        int[][] bucket = new int[bucketCount][arr.length];
        // 记录每个位置桶里数据量
        int[] bucketEleCount = new int[bucketCount];
        // 数组存值时的下标
        int index;
        // i代表处理的位数(0 个位, 1 百位,。。。; n代表被除数,用来找出对应位置的数是多少)
        for (int i = 0, n = 1; i < maxLength; i ++, n *= 10) {
            for (int j = 0; j < arr.length; j ++) {
                // 取出该数据对应位数的值
                int element = arr[j] / n % 10;
                // 存入桶数组中
                bucket[element][bucketEleCount[element]] = arr[j];
                // 对应桶计数+1
                bucketEleCount[element] += 1;
            }
            index = 0;
            // 从桶中按顺序取值,并存入数组中
            for (int k = 0; k < bucketCount; k ++) {
                if (bucketEleCount[k] != 0) {
                    for (int count = 0; count < bucketEleCount[k]; count ++) {
                        arr[index ++] = bucket[k][count];
                    }
                }
                bucketEleCount[k] = 0;
            }
        }
    }
}

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页