1. public class RadixSort {
    2. public static void main(String[] args) {
    3. int[] arr = {53, 3, 542, 748, 14, 214};
    4. radixSort(arr);
    5. }
    6. //基数排序方法
    7. public static void radixSort(int[] arr) {
    8. //第1轮(针对每个元素的个位进行排序处理)
    9. //定义一个二维数组,表示10个桶,每个桶就是一个一维数组
    10. //说明
    11. //1.二维数组包含10个一位数组
    12. //2.为了防止在放入数的时候,数据溢出,则每个一位数组(桶),大小定为arr.length
    13. //3.基数排序是使用空间换时间的经典算法
    14. int[][] bucket = new int[10][arr.length];//桶
    15. //为了记录每个桶中,实际存放了多少个数据,我们定义一个一维数组来记录各个桶的每次放入的数据个数
    16. //可以这样理解
    17. //比如: bucketElementCounts[0], 记录的就是 bucket[0] 桶的放入数据个数
    18. int[] bucketElementCounts = new int[10];//每个桶中数据的个数
    19. //第1轮(针对每一元素的个位进行排序处理)
    20. for (int j = 0; j < arr.length; j++) {
    21. //取出每个元素的个位的值
    22. int digitOfElement = arr[j] / 1 % 10;//有规律
    23. //放入到对应的桶中
    24. bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
    25. bucketElementCounts[digitOfElement]++;
    26. }
    27. //按照这个桶的顺序(按一维数组的下标依次取出数据,放入原来数组)
    28. int index = 0;
    29. //遍历每一个桶,并将桶中的数据,放入到原数组
    30. for (int k = 0; k < bucketElementCounts.length; k++) {
    31. //如果桶中,有数据,我们才放入到原数组
    32. if (bucketElementCounts[k] != 0) {
    33. //循环该桶,即第k个桶
    34. for (int l = 0; l < bucketElementCounts[k]; l++) {
    35. //取出元素放入到arr
    36. arr[index] = bucket[k][l];
    37. index++;
    38. }
    39. }
    40. //第1轮处理后,需要将每个bucketElementCounts[k] = 0 !!!
    41. bucketElementCounts[k] = 0;
    42. }
    43. System.out.println("第1轮: " + Arrays.toString(arr));
    44. //*************************************************************************
    45. //第2轮(针对每一元素的十位进行排序处理)
    46. for (int j = 0; j < arr.length; j++) {
    47. //取出每个元素的个位的值
    48. int digitOfElement = arr[j] / 10 % 10;
    49. //放入到对应的桶中
    50. bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
    51. bucketElementCounts[digitOfElement]++;
    52. }
    53. //按照这个桶的顺序(按一维数组的下标依次取出数据,放入原来数组)
    54. index = 0;
    55. //遍历每一个桶,并将桶中的数据,放入到原数组
    56. for (int k = 0; k < bucketElementCounts.length; k++) {
    57. //如果桶中,有数据,我们才放入到原数组
    58. if (bucketElementCounts[k] != 0) {
    59. //循环该桶,即第k个桶
    60. for (int l = 0; l < bucketElementCounts[k]; l++) {
    61. //取出元素放入到arr
    62. arr[index] = bucket[k][l];
    63. index++;
    64. }
    65. }
    66. //第2轮处理后,需要将每个bucketElementCounts[k] = 0 !!!
    67. bucketElementCounts[k] = 0;
    68. }
    69. System.out.println("第2轮: " + Arrays.toString(arr));
    70. //*************************************************************************
    71. //第3轮(针对每一元素的百位进行排序处理)
    72. for (int j = 0; j < arr.length; j++) {
    73. //取出每个元素的个位的值
    74. int digitOfElement = arr[j] / 100 % 10;
    75. //放入到对应的桶中
    76. bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
    77. bucketElementCounts[digitOfElement]++;
    78. }
    79. //按照这个桶的顺序(按一维数组的下标依次取出数据,放入原来数组)
    80. index = 0;
    81. //遍历每一个桶,并将桶中的数据,放入到原数组
    82. for (int k = 0; k < bucketElementCounts.length; k++) {
    83. //如果桶中,有数据,我们才放入到原数组
    84. if (bucketElementCounts[k] != 0) {
    85. //循环该桶,即第k个桶
    86. for (int l = 0; l < bucketElementCounts[k]; l++) {
    87. //取出元素放入到arr
    88. arr[index] = bucket[k][l];
    89. index++;
    90. }
    91. }
    92. //第3轮处理后,需要将每个bucketElementCounts[k] = 0 !!!
    93. bucketElementCounts[k] = 0;
    94. }
    95. System.out.println("第3轮: " + Arrays.toString(arr));
    96. }
    97. }

    image.png