基数(桶)排序Java代码实现

基数(桶)排序Java代码实现

基数排序也被称为桶排序,是一种使用空间换时间的做法。它的大致思想为:

  1. 每个数字按低位到高位进行遍历排序,第几位就放在第几个桶中
  2. 排序完成以后,再将桶内数组取出重新放入原始数组,最后清空
  3. 不断往复1-2过程,直到对数字的每个位都进行了操作,既完成了排序

图解(待完成)

不足:

  • 只针对正数的排序

一些细节:

基数排序的时间复杂度位NxK,K代表着桶的个数。

有人会好奇,0-9对应的这10个桶在进行操作的时候,比如说个位遍历结束后,准备遍历十位时,不需要对10个桶进行清空吗?回答是不需要对桶整个进行清空,但要对保存着每个桶的bucketElementCounts数组进行清空,具体做法为,在取出元素的时候,每取出一个桶的,就把这个bucketElementCounts数组存储的索引进行清空,以便下一次对十位进行排序。

package sort;

import java.util.Arrays;

/**
 * 基数排序(桶排序)
 */
public class RadixSort {
    public static void main(String[] args) {
        // 原始数组
        int[] arr = { 53, 3, 542, 748, 14, 214};
        System.out.println("原始数组:"+ Arrays.toString(arr));
        // 定义桶为一个二维数组 10:位数 arr.length:桶内一维数组大小
        int[][] bucket = new int[10][arr.length];

        // 定义一个记录桶内一维数组元素个数的工具
        int[] bucketElementCounts = new int[10];

        // 1.桶排序的循环次数与最大数的位数相关,找到最大的数字,确定位数
        // 1.1假设arr[0]最大
        int max = arr[0];
        for (int i = 1; i < arr.length - 1; i++) {
            if (arr[i] > max){
                max = arr[i];
            }
        }
        // 1.2得到了最大数字是几位数
        int maxLength = (max + "").length();

        // 2.进行循环,使用i控制循环次数(取模),使用n控制步长
        for (int i = 0,n = 1;i <maxLength; i++, n *= 10){
            // 2.1 对每个arr中的元素取余数
            for (int j = 0; j< arr.length;j++){
                int single = arr[j] / n % 10;
                // 2.2依据位数,放入对应的桶中
                bucket[single][bucketElementCounts[single]] = arr[j];
                bucketElementCounts[single]++; // 2.2需要理解
            }
            // 3.放入桶结束,从桶中取出元素放入arr开始
            int index = 0; // arr数组的索引
            //3.1 遍历桶
            for (int k = 0; k < bucketElementCounts.length; k++){
                // 3.2如果桶内有元素
                if (bucket[k].length != 0){
                    // 3.3遍历桶内元素,放入arr
                    for (int l = 0; l < bucketElementCounts[k];l++){
                        arr[index++] = bucket[k][l];
                    }
                }
                // 3.4记录桶内一维数组元素个数的工具,置0
                bucketElementCounts[k] = 0;
            }
        }
        System.out.println("排序后数组:"+Arrays.toString(arr)); // [3, 14, 53, 214, 542, 748]
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值