基本介绍
基数排序属于“分配式排序”,它通过元素的各个位的值,将元素放置对应的“桶”中
基数排序属于稳定性排序,效率高,但是过多的元素会出现虚拟机运行内存的不足(千万个元素)
基本思想
把元素统一为同样长度的数组长度 元素较短的数前面补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();}}
