基数排序(实现对负数的排序)以力扣912题为例

发布时间:2024年01月19日

力扣912题(用基数排序实现):??力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

class Solution {
    public int[] sortArray(int[] nums) {
        // 基数排序(实现负数和正数的排序),空间换时间
        int max = nums[0];
        int min = nums[0];
        for (int i = 1; i < nums.length; i++) {
            max = nums[i] > max ? nums[i] : max;
            min = nums[i] < min ? nums[i] : min;
        }
        //确定最大位是什么?(个、十、百。。。)
        int maxLength = (max + "").length() > (min + "").length() ? (max + "").length() : (min + "").length();
        // 定义一个二维数组
        int[][] bucket = new int[10][nums.length];
        int[] count = new int[10];// 记录每个桶中元素的个数

        //将数组中所有的数加上最小值的绝对值,变成正数
        for(int i =0;i<nums.length;i++){
            nums[i] += Math.abs(min);
        }

        for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
            for (int j = 0; j < nums.length; j++) {
                int element = nums[j] / n % 10;
                // 放入对应的桶中
                bucket[element][count[element]] = nums[j];
                count[element]++;
            }
            int index = 0;
            for (int k = 0; k < count.length; k++) {
                if (count[k] != 0) {// 说明第k个桶内有数据
                    for (int l = 0; l < count[k]; l++) {// 说明第k个桶内有count[k]个数据
                        nums[index] = bucket[k][l];
                        index++;
                    }
                }
                count[k] = 0;// 将10个筒内数据的个数清零
            }
        }
        //变回原来的数组
        for(int i =0;i<nums.length;i++){
            nums[i] -= Math.abs(min);
        }
        return nums;
    }
}

文章来源:https://blog.csdn.net/liusaidh/article/details/135685876
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。