学习笔记-基数排序

基数排序

将一个一维数组从大到小排列。基数排序是桶排序的扩展。它是一种稳定的排序方法,也就是说,排序之前相同大小的数字的位置次序在排序后并没有发生改变。同时,基数排序是一种用空间换时间的排序方法,当数据量过大时,java的堆内存耗尽,方法就不能使用了。

思路

基数排序的思路是:首先创建10个桶(二维数组),然后依次遍历原数组,取每一个数的个位数,并按个位数的大小放入桶中,比如5就放在下标为5的桶,17就放在下标为7的桶,729就放在下标为9的桶。遍历结束后,在按照顺序从桶中取出数据放回到原数组,也就是遍历桶,取出数据,放入原数组。第二次,取每个数的十位重复操作,没有十位的数认为十位是0,第三次取百位,一直取原数组中最大数的长度次,此时就排列完毕。
需要注意的是,不能排列负数。
在这里插入图片描述
在这里插入图片描述

代码

private static void radixSort(int[] arr){
        //按位存放数字
        int[][] bucket=new int[10][arr.length];
        //存放数字的个数
        int[] bucketCount=new int[10];
        int max=arr[0];
        for (int i = 0; i <arr.length ; i++) {
            if(arr[i]>max){
                max=arr[i];
            }
        }
        int maxLength=(max+"").length();

        for (int i = 0,n=1; i <maxLength ; i++,n=n*10) {
            //按位存数据
            for (int j = 0; j <arr.length ; j++) {
                int digth=arr[j] / n % 10;
                bucket[digth][bucketCount[digth]]=arr[j];
                bucketCount[digth]++;
            }
            //按位取数据
            int index=0;
            for (int k = 0; k <10 ; k++) {
                if(bucketCount[k]!=0) {
                    for (int l = 0; l < bucketCount[k]; l++) {
                        arr[index++]=bucket[k][l];
                    }
                }
                //还原
                bucketCount[k]=0;
            }
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值