基数排序

package com.dai.sort;

import java.util.Arrays;

public class RadixSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = {53, 3, 542, 7488, 14, 214};
        radixSort(arr);
    }
    public static void radixSort(int[] arr) {
        //得到最大的数及位数
        int max = arr[0];
        for(int i=0;i<arr.length;i++) {
            if(max<arr[i]) {
                max = arr[i];
            }
        }
        int maxLength = (max + "").length();
        
        //第一轮排序(针对每个元素的各位进行排序)
        //定义一个二维数组,表10个桶,为防止栈数据溢出,每个一维数组大小为arr.length
        //基数排序是使用空间换时间的经典算法
        int[][] bucket = new int[10][arr.length];
        //为了记录每个桶中实际存放的多少数据,定义一个一维数组记录各个桶每次放入的个数
        int[] bucketElementCounts = new int[10];
        
        //使用循环
        for(int i=0,n=1;i<maxLength;i++,n*=10) {
        for(int j=0;j<arr.length;j++) {
            //取出每个元素的各位
            int digitOfElement = arr[j] /n % 10;
            //放入对应的桶
            bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
            bucketElementCounts[digitOfElement]++;
        }
        //按照桶的顺序
        int index = 0;
        for(int k=0;k<10;k++) {
            //如果桶中有数据,才放入到原数组
            if(bucketElementCounts[k]!=0) {
                //循环第k个一维数组
                for(int l=0;l<bucketElementCounts[k]; l++) {
                    arr[index] = bucket[k][l];
                    index++;
                }
            }
            bucketElementCounts[k] = 0;
        }
        System.out.println(Arrays.toString(arr));
        }
    }
}
原文地址:https://www.cnblogs.com/shengtudai/p/14418115.html