实现原理:
1.获取最大数的位数:首先确定数组中最大数的位数 𝑘k。
2.按照位进行排序:从最低位开始到最高位,对每一位进行排序。
3.使用队列或桶:对于每一位,使用队列或桶(bucket)来收集相应位上的数字。对于每一位上的数字,从0到9创建10个队列或桶。
4.分配和收集:将每个数字根据当前位上的数值分配到对应的队列或桶中,然后按顺序收集这些数字回原数组。
5.重复:对每一位重复上述过程,直到最高位排序完成。
package 八大排序;
//基数排序
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int[] arr = {1,4,6,3,2,56,3,12,33,76,100};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr){
//找到数组中最大的值
int max = Arrays.stream(arr).max().getAsInt();
//获取数组中最大值的位数
int maxLength = (max+"").length();
//定义桶
int[][] bucket = new int[10][arr.length];
//定义桶记录工具
int[] buckerCounts = new int[10];
int n = 1;
for(int h=0;h<maxLength;h++){
//将数据放入桶内
for (int i=0;i<arr.length;i++){
//放到哪个桶
int element = arr[i]/n%10;//获取个位数值,element代表各个位的数值,也代表要放入哪号桶
//读取桶记录工具,确定放到桶内的哪个位置
int count = buckerCounts[element];
//数据放入
bucket[element][count] = arr[i];
//桶记录加1
buckerCounts[element]++;
}
//数据取出
//遍历数组
int index = 0;
//遍历桶记录
for (int k=0;k<buckerCounts.length;k++){
if(buckerCounts[k]!=0){
for (int l=0;l<buckerCounts[k];l++){
arr[index] = bucket[k][l];
index++;
}
}
//桶记录清零
buckerCounts[k] = 0;
}
//更新位数
n = n * 10;
}
}
}