import java.util.ArrayList;
import java.util.Arrays;
//基数排序
public class RadixSort {
public static void main(String[] args) {
int[] array = new int[]{20, 21, 8, 30, 20, 6, 51, 14};
RadixSort(array);
System.out.println(Arrays.toString(array));
}
public static int[] RadixSort(int[] arr){
if(arr.length == 0 || arr.length ==1)
return arr;
// max 指数组中最大的数,maxDigit 指这个最大的数是几位数
int max = arr[0];
for(int x:arr)
max = Math.max(x,max);
int maxDigit = 0;
while(max != 0){
max /= 10;
maxDigit++;
}
// mod 用于为数组中的数取余数,div 用于把通过 mod 取的余数变成个位数
int mod = 10;
int div = 1;
ArrayList<ArrayList<Integer>> bucket = new ArrayList<ArrayList<Integer>>();
for(int j = 0;j < 10;j++){
bucket.add(new ArrayList<Integer>());
}
for(int i = 0;i<maxDigit;i++,mod *= 10,div *= 10){
// 打印这一轮的排序结果
System.out.println(Arrays.toString(arr));
for(int j = 0;j < arr.length;j++){
// num 指当前元素 arr[j] 的个/十/百/千位是几
int num = (arr[j] % mod) / div;
bucket.get(num).add(arr[j]);
}
int index = 0;
for(int j = 0;j < 10;j++){
if(bucket.get(j).size() != 0){
for(int x:bucket.get(j))
arr[index++] = x;
// 将桶中所有的动态数组清空,否则第二次循环开始再用到这些动态数组时里面还会有数据
bucket.get(j).clear();
}
}
}
return arr;
}
}
基数排序(Java)
最新推荐文章于 2024-07-27 13:31:57 发布