数据结构排序算法之基数排序(桶排序的扩展)代码实现及详细注释

package Sort;

import java.util.Arrays;

/*
    基数排序:“桶排序”扩展
    思路:使用一个 二维数组bucket[][]模拟10个桶(二维数组的行表示桶的个数,列表示桶的大小),
         再用一个一位数组bucketCount[]记录每个桶中每次插入的元素

         先找出数组中最大的数,即位数最多的,它决定了循环的次数
    第一轮:比较个位上的数:个位上的数可能为0 - 9 中的任意一个,将原数放入对应的桶中,
            如,10-->(0-->(10)-->0号桶),11-->(1-->(11)-->1号桶),以此类推 ....
    第二轮:比较十位上的数,没有则为零,也是根据百位上的数 对应 桶
    第三轮:比较百位上的数,没有则为零,..............
    .....

//典型的 以空间换时间

 */
public class radixSort {

    public static void main(String[] args) {
        //待排序的数组
        //int [] arr = new int[10];
        int [] arr = {2,1,13,24,65,30,47};
        radixSort(arr);
        System.out.println(Arrays.toString(arr));

    }

    //基数排序算法
    public static void radixSort(int [] arr){

        //一个二维数组 包含十个一维数组--> 十个桶
        //行表示第几个桶,列表示桶的大小
        int [][] bucket = new int[10][arr.length];

        //定义一个一维数组,记录十个桶中每个桶存放的元素的个数
        int [] bucketCount = new int[10];

        //第一步,获取数组的最大的数-->得到位数
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if(arr[i] > max){
                max = arr[i];
            }
        }
        //得到最大的位数长度
        int maxLength = (max+"").length();

        //开始循环遍历
        int base = 1;//用的得到每一位上的数
        for (int i = 0; i < maxLength; i++,base *= 10) {
            for (int k = 0; k < arr.length; k++) {
                int digit = ( arr[k] / base ) % 10;//得到每一位上的数
                //放到对应的桶中
                bucket[digit][ bucketCount[digit] ] = arr[k];
                bucketCount[digit]++;//对应桶中存放的个数 + 1
            }
            //此时,已经把所有元素放入桶中
            //然后,从桶0 - 9 按顺序取出桶中的元素,重新放入arr中
            int index = 0;//记录arr的下标
            for (int j = 0; j < bucketCount.length; j++) {//遍历10个桶
                //从第0个桶开始
                if(bucketCount[j] != 0){//桶里面放有元素,共bucketCount[j]个
                    //循环拿出来
                    for(int h = 0; h < bucketCount[j]; h++){
                        arr[index] = bucket[j][h];//第j个桶的第h个元素
                        index++;
                    }
                    //取完第j个桶的元素后,把它的长度置为0,特别注意这一点细节
                    bucketCount[j] = 0;
                }
            }

        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值