准备一个大小为10(索引为0~9)的桶,取待排序数组中的每一位(从低位到高位)依次放到对应的桶中。
流程:
- 找到数组arr中的最大值,并求出最大值的位数,表示外层循环的次数
- 遍历数组,统计数组arr[i]对应的数字,并放到对应的桶中,同时统计当前桶存放的数字个数
- 将桶中的数据依次全部取出,放入原来的数组
- 重复进行第2、3、4步
代码实现:
package com.atguigu.sort;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int[] arr= {76,1,67,16,8,30};
radixSort(arr);
System.out.println("基数排序后的数组:"+Arrays.toString(arr));
}
//基数排序方法
public static void radixSort(int[] arr) {
//循环次数
int num=dig(arr);
int base=1;//记录每次循环比较的位置(个位,十位,百位...)
int len=arr.length;
while(num!=0) {
//2.遍历数组,统计数组arr[i]对应的数字,并放到对应的桶中,同时统计当前桶存放的数字个数
int[][] tong=new int[10][len];//前一个标记哪个桶,后一个标记当前桶中放的个数
int[] count=new int[10];//统计当前桶放了几个数
for(int i=0;i<len;++i) {//遍历数组
int temp=arr[i]/base%10;//统计arr[i]当前位对应的值
tong[temp][count[temp]++]=arr[i];
}
//3.将桶中的数据依次全部取出,放入原来的数组
int t=0;
for(int j=0;j<10;++j) {
if(count[j]>0) {//说明j桶内有数字存储
for(int k=0;k<count[j];++k) {//j桶内存储的数字个数
arr[t++]=tong[j][k];
}
}
}
//更换到下一位(如果上一次比较的个位,那这一次就是比较十位)
base*=10;
num--;
}
}
//1.找到数组arr中的最大值,并求出最大值的位数,表示外层循环的次数
public static int dig(int[] arr) {
//找到数组arr中的最大值,这里默认数组非空
int max=arr[0];
int len=arr.length;//数组长度
for(int i=1;i<len;++i) {
max=max>arr[i]?max:arr[i];
}
//求出最大值的位数
int cnt=0;
if(max==0) {
return 1;
}
while(max!=0) {
max/=10;
cnt++;
}
return cnt;
}
}