基本介绍
基数排序属于“分配式排序”,它通过元素的各个位的值,将元素放置对应的“桶”中
基数排序属于稳定性排序,效率高,但是过多的元素会出现虚拟机运行内存的不足(千万个元素)
基本思想
把元素统一为同样长度的数组长度 元素较短的数前面补0,比如(1 15 336 看成 001 015 336)
然后从最低位开始,以此进行排序
下图为动图演示:
代码
import java.util.Arrays;
/**
* @Author leijs
* @date 2021/8/17
*/
public class RadixSort {
public static void main(String[] args) {
int[] arr = {1, 4, 3, 6, 8, 4, 9, 6, 2};
int[] arr1 = sort(arr);
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]);
}
}
public static int[] sort(int[] arr) {
// 获取最高位数
int maxDigit = getMaxDigit(arr);
return redixSort(arr, maxDigit);
}
private static int[] redixSort(int[] arr, int maxDigit) {
int mod = 10;
int dev = 1;
for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
// 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
int[][] counter = new int[mod * 2][0];
for (int j = 0; j < arr.length; j++) {
int bucket = ((arr[j] % mod) / dev) + mod;
//自动扩容,并保存数据
counter[bucket] = arrayAppend(counter[bucket], arr[j]);
}
int pos = 0;
for (int[] bucket : counter) {
for (int value : bucket) {
arr[pos++] = value;
}
}
}
return arr;
}
private static int[] arrayAppend(int[] arr, int value) {
arr = Arrays.copyOf(arr, arr.length + 1);
arr[arr.length - 1] = value;
return arr;
}
private static int getMaxDigit(int[] arr) {
int max = arr[0];
for (int value : arr) {
if (max < value) {
max = value;
}
}
return String.valueOf(max).length();
}
}