JAVA十大排序中的-(基数排序)

前奏
基数排序是桶排序升级版,利用桶思想将移动对应的位数放到各个对应的桶中,在取出达到一定次数下就会变成有序列表
也是一种空间换时间的思想
思路
思路:
        1:创建一个长度为10的二维数组,代表十个桶 
        2:然后遍历对应的无序列表移动当前位数按照位数值放入到对应的桶中 ,本次循环无序列表结束后也是放入结束后,然后依次取出
        3:重复2步骤直到最大位数移动结束后整个列表就有序了 

注意:基数排序是空间换时间,所以如果你要排序千万级数据移动要注意你的内存是否够多,不然的话内存溢出 
          基数排序要注意数值尽量别是负数 
        
总结:
    1:就是先将无需列表按照位数放入到对应的桶中
    2:然后将桶中的数据依次的取出存入到原数组中
课外仅供参考
如果与一组8000个数据的数组排序的情况下             时间差不多10毫秒不到 
如果与一组80000个数据的数组排序的情况下            时间差不多50毫秒不到
如果与一组800000个数据的数组排序的情况下           时间差不多120毫秒不到
如果与一组8000000个数据的数组排序的情况下          时间差不多1.3秒不到
如果与一组80000000个数据的数组排序的情况下         时间差不多11秒不到
图解 1

在这里插入图片描述

图解 2

在这里插入图片描述

代码
//基数排序(桶排序的升级版)
/**
 *  功能:捅排序
 *  时间:2020/4/26 16:06
 *  参数:名称            类型            描述
 *       orderByArray   int []         未排序的数组
 *
 *  返回:void
 *  描述:无
 */
public static void bucket(int [] orderByArray){

    //创建一个捅数组
    int [][] bucket=new int[10][orderByArray.length];

    //创建一个记录各个捅对应的有效数量
    int [] bucketValidNumber=new int[10];

    //创建一个当前除数
    int currentDivider=1;

    int count=0;

    while(true){
        //创建一个flag标志用于
        boolean flag=true;

        //进行装捅操作
        for(int index=0;index<orderByArray.length;index++){

            int currNumber=orderByArray[index];
            //获取当值在捅中的位置
            int backetLocation=currNumber/currentDivider%10;

            //装通操作
            bucket[backetLocation][bucketValidNumber[backetLocation]]=currNumber;

            //对当前位置的捅进行数量更新
            bucketValidNumber[backetLocation]++;

            //获取当前值下一次捅的位置
            int lastBacketLocation=currNumber/(currentDivider*10)%10;

            if(lastBacketLocation>0)flag=false;
        }

        //进行拆捅操作
        for(int index=0;index<bucketValidNumber.length;index++){
            int validNumber=bucketValidNumber[index];
            if(validNumber>0){
                //获取指定捅对应的数值进行
                for(int i=0;i<validNumber;i++){
                    orderByArray[count++]=bucket[index][i];
                }
                //对当前的捅清零
                bucketValidNumber[index]=0;
            }
        }

        //判断是否需要下次再次装捅
        if(flag) break;
        //调整除数信息
        currentDivider*=10;
        count=0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值