排序算法7-基数排序

描述

找出序列中值最大的元素,循环它的位数(个、十、百、千……),循环过程中依次对序列中的元素按位数排序,结束后得到有序序列

代码实现

/**
 * 基数排序(经典空间换时间)
 */
public class RadixSort {


    public static void main(String[] args) {
        //以下为推导过程
        int[] arr = {46, 1, 8, 9, 15, 233, 566};
        //桶数组
        int[][] bucket = new int[10][arr.length];
        //各桶数量记录数组(用来记录每个桶放置了多少个元素,bucketElementCount[2] = 第三个桶放置元素的数量)
        int[] bucketElementCount = new int[10];

        sort(arr);

//         /**
//         * 根据个位数放置
//         */
//        for (int i = 0; i < arr.length; i++) {
//            //拿到个位数
//            int digitOfElement = arr[i] % 10;
//            //与桶数组比较,确定放置位置
//            bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[i];
//            //放置元素的桶数量+1
//            bucketElementCount[digitOfElement]++;
//        }
//        int count = 0;
//        //按顺序从桶中取出元素,替换原数组
//        for (int i = 0; i < bucket.length; i++) {
//            if (bucketElementCount[i] != 0) {
//                for (int j = 0; j < bucketElementCount[i]; j++) {
//                    arr[count] = bucket[i][j];
//                    count++;
//                }
//                //清空各桶数量记录数组,用于下次放置
//                bucketElementCount[i] = 0;
//            }
//        }
//        System.out.println(Arrays.toString(arr));
//
//        /**
//         * 根据十位数放置
//         */
//        for (int i = 0; i < arr.length; i++) {
//            //拿到十位数
//            int digitOfElement = arr[i] / 10 % 10;
//            bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[i];
//            bucketElementCount[digitOfElement]++;
//        }
//        count = 0;
//        for (int i = 0; i < bucket.length; i++) {
//            if (bucketElementCount[i] != 0) {
//                for (int j = 0; j < bucketElementCount[i]; j++) {
//                    arr[count] = bucket[i][j];
//                    count++;
//                }
//                bucketElementCount[i] = 0;
//            }
//        }
//        System.out.println(Arrays.toString(arr));
//
//        /**
//         * 根据百位数放置
//         */
//        for (int i = 0; i < arr.length; i++) {
//            //拿到百位数
//            int digitOfElement = arr[i] / 100 % 10;
//            bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[i];
//            bucketElementCount[digitOfElement]++;
//        }
//        count = 0;
//        for (int i = 0; i < bucket.length; i++) {
//            if (bucketElementCount[i] != 0) {
//                for (int j = 0; j < bucketElementCount[i]; j++) {
//                    arr[count] = bucket[i][j];
//                    count++;
//                }
//                bucketElementCount[i] = 0;
//            }
//        }
//        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr) {
        int[][] bucket = new int[10][arr.length];
        int[] bucketElementCount = new int[10];

        //得到最大的数
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (max < arr[i]) {
                max = arr[i];
            }
        }
        //得到数组中最大的数有几位
        int digitsNum = ("" + max).length();

        for (int z = 0, x = 1; z < digitsNum; z++, x *= 10) {
            for (int i = 0; i < arr.length; i++) {
                //拿到个位数
                int digitOfElement = arr[i] / x % 10;
                //与桶数组比较,确定放置位置
                bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[i];
                //放置元素的桶数量+1
                bucketElementCount[digitOfElement]++;
            }
            int count = 0;
            //按顺序从桶中取出元素,替换原数组
            for (int i = 0; i < bucket.length; i++) {
                if (bucketElementCount[i] != 0) {
                    for (int j = 0; j < bucketElementCount[i]; j++) {
                        arr[count] = bucket[i][j];
                        count++;
                    }
                    //清空各桶数量记录数组,用于下次放置
                    bucketElementCount[i] = 0;
                }
            }
            System.out.println(Arrays.toString(arr));
        }

    }
}

性能

该算法属于非比较型排序算法,性能受序列大小n和序列中最大值位数m影响

所以最坏、最好、平均时间复杂度都是O(n*m)空间复杂度O(m)

属于稳定排序算法

MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值