import java.util.Arrays;
/**
* @author mccrea
* @version 1.0
* @description: 基数排序
* @date 2020/9/20 16:03
*/
public class RadixSort {
public static void main(String[] args) {
int[] arr = new int[]{23,12,543,56,24,987};
radixSort(arr);
System.out.println(Arrays.toString(arr));
}
/**
* @description: 基数排序(只针对正数)
* @param:
* @param arr 待排序数组
* @return: void
* @author mccrea
* @date: 2020/9/20 16:04
*/
public static void radixSort(int[] arr) {
// 桶的个数
int bucketCount = 10;
// 先找出最大值
int max = arr[0];
for (int value : arr) {
if (value > max) {
max = value;
}
}
// 最大值位数
int maxLength = (max + "").length();
// 桶数组
int[][] bucket = new int[bucketCount][arr.length];
// 记录每个位置桶里数据量
int[] bucketEleCount = new int[bucketCount];
// 数组存值时的下标
int index;
// i代表处理的位数(0 个位, 1 百位,。。。; n代表被除数,用来找出对应位置的数是多少)
for (int i = 0, n = 1; i < maxLength; i ++, n *= 10) {
for (int j = 0; j < arr.length; j ++) {
// 取出该数据对应位数的值
int element = arr[j] / n % 10;
// 存入桶数组中
bucket[element][bucketEleCount[element]] = arr[j];
// 对应桶计数+1
bucketEleCount[element] += 1;
}
index = 0;
// 从桶中按顺序取值,并存入数组中
for (int k = 0; k < bucketCount; k ++) {
if (bucketEleCount[k] != 0) {
for (int count = 0; count < bucketEleCount[k]; count ++) {
arr[index ++] = bucket[k][count];
}
}
bucketEleCount[k] = 0;
}
}
}
}