基本介绍

基数排序属于“分配式排序”,它通过元素的各个位的值,将元素放置对应的“桶”中
基数排序属于稳定性排序,效率高,但是过多的元素会出现虚拟机运行内存的不足(千万个元素)

基本思想

把元素统一为同样长度的数组长度 元素较短的数前面补0,比如(1 15 336 看成 001 015 336)
然后从最低位开始,以此进行排序
下图为动图演示:
基数排序 - 图1

代码

  1. import java.util.Arrays;
  2. /**
  3. * @Author leijs
  4. * @date 2021/8/17
  5. */
  6. public class RadixSort {
  7. public static void main(String[] args) {
  8. int[] arr = {1, 4, 3, 6, 8, 4, 9, 6, 2};
  9. int[] arr1 = sort(arr);
  10. for (int i = 0; i < arr1.length; i++) {
  11. System.out.print(arr1[i]);
  12. }
  13. }
  14. public static int[] sort(int[] arr) {
  15. // 获取最高位数
  16. int maxDigit = getMaxDigit(arr);
  17. return redixSort(arr, maxDigit);
  18. }
  19. private static int[] redixSort(int[] arr, int maxDigit) {
  20. int mod = 10;
  21. int dev = 1;
  22. for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
  23. // 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
  24. int[][] counter = new int[mod * 2][0];
  25. for (int j = 0; j < arr.length; j++) {
  26. int bucket = ((arr[j] % mod) / dev) + mod;
  27. //自动扩容,并保存数据
  28. counter[bucket] = arrayAppend(counter[bucket], arr[j]);
  29. }
  30. int pos = 0;
  31. for (int[] bucket : counter) {
  32. for (int value : bucket) {
  33. arr[pos++] = value;
  34. }
  35. }
  36. }
  37. return arr;
  38. }
  39. private static int[] arrayAppend(int[] arr, int value) {
  40. arr = Arrays.copyOf(arr, arr.length + 1);
  41. arr[arr.length - 1] = value;
  42. return arr;
  43. }
  44. private static int getMaxDigit(int[] arr) {
  45. int max = arr[0];
  46. for (int value : arr) {
  47. if (max < value) {
  48. max = value;
  49. }
  50. }
  51. return String.valueOf(max).length();
  52. }
  53. }