@@ -47,4 +47,89 @@ function radixSort(arr, maxDigit) {
47
47
}
48
48
return arr;
49
49
}
50
- ```
50
+ ```
51
+
52
+ ## 4. Java 代码实现
53
+
54
+ ``` java
55
+ /**
56
+ * 基数排序
57
+ * 考虑负数的情况还可以参考: https://code.i-harness.com/zh-CN/q/e98fa9
58
+ */
59
+ public class RadixSort implements IArraySort {
60
+
61
+ @Override
62
+ public int [] sort (int [] sourceArray ) throws Exception {
63
+ // 对 arr 进行拷贝,不改变参数内容
64
+ int [] arr = Arrays . copyOf(sourceArray, sourceArray. length);
65
+
66
+ int maxDigit = getMaxDigit(arr);
67
+ return radixSort(arr, maxDigit);
68
+ }
69
+
70
+ /**
71
+ * 获取最高位数
72
+ */
73
+ private int getMaxDigit (int [] arr ) {
74
+ int maxValue = getMaxValue(arr);
75
+ return getNumLenght(maxValue);
76
+ }
77
+
78
+ private int getMaxValue (int [] arr ) {
79
+ int maxValue = arr[0 ];
80
+ for (int value : arr) {
81
+ if (maxValue < value) {
82
+ maxValue = value;
83
+ }
84
+ }
85
+ return maxValue;
86
+ }
87
+
88
+ protected int getNumLenght (long num ) {
89
+ if (num == 0 ) {
90
+ return 1 ;
91
+ }
92
+ int lenght = 0 ;
93
+ for (long temp = num; temp != 0 ; temp /= 10 ) {
94
+ lenght++ ;
95
+ }
96
+ return lenght;
97
+ }
98
+
99
+ private int [] radixSort (int [] arr , int maxDigit ) {
100
+ int mod = 10 ;
101
+ int dev = 1 ;
102
+
103
+ for (int i = 0 ; i < maxDigit; i++ , dev *= 10 , mod *= 10 ) {
104
+ // 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
105
+ int [][] counter = new int [mod * 2 ][0 ];
106
+
107
+ for (int j = 0 ; j < arr. length; j++ ) {
108
+ int bucket = ((arr[j] % mod) / dev) + mod;
109
+ counter[bucket] = arrayAppend(counter[bucket], arr[j]);
110
+ }
111
+
112
+ int pos = 0 ;
113
+ for (int [] bucket : counter) {
114
+ for (int value : bucket) {
115
+ arr[pos++ ] = value;
116
+ }
117
+ }
118
+ }
119
+
120
+ return arr;
121
+ }
122
+
123
+ /**
124
+ * 自动扩容,并保存数据
125
+ *
126
+ * @param arr
127
+ * @param value
128
+ */
129
+ private int [] arrayAppend (int [] arr , int value ) {
130
+ arr = Arrays . copyOf(arr, arr. length + 1 );
131
+ arr[arr. length - 1 ] = value;
132
+ return arr;
133
+ }
134
+ }
135
+ ```
0 commit comments