MCPcopy
hub / github.com/hustcc/JS-Sorting-Algorithm / RadixSort

Class RadixSort

src/java/main/RadixSort.java:8–83  ·  view source on GitHub ↗

基数排序 考虑负数的情况还可以参考: https://code.i-harness.com/zh-CN/q/e98fa9

Source from the content-addressed store, hash-verified

6 * 考虑负数的情况还可以参考: https://code.i-harness.com/zh-CN/q/e98fa9
7 */
8public class RadixSort implements IArraySort {
9
10 @Override
11 public int[] sort(int[] sourceArray) throws Exception {
12 // 对 arr 进行拷贝,不改变参数内容
13 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
14
15 int maxDigit = getMaxDigit(arr);
16 return radixSort(arr, maxDigit);
17 }
18
19 /**
20 * 获取最高位数
21 */
22 private int getMaxDigit(int[] arr) {
23 int maxValue = getMaxValue(arr);
24 return getNumLenght(maxValue);
25 }
26
27 private int getMaxValue(int[] arr) {
28 int maxValue = arr[0];
29 for (int value : arr) {
30 if (maxValue < value) {
31 maxValue = value;
32 }
33 }
34 return maxValue;
35 }
36
37 protected int getNumLenght(long num) {
38 if (num == 0) {
39 return 1;
40 }
41 int lenght = 0;
42 for (long temp = num; temp != 0; temp /= 10) {
43 lenght++;
44 }
45 return lenght;
46 }
47
48 private int[] radixSort(int[] arr, int maxDigit) {
49 int mod = 10;
50 int dev = 1;
51
52 for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
53 // 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
54 int[][] counter = new int[mod * 2][0];
55
56 for (int j = 0; j < arr.length; j++) {
57 int bucket = ((arr[j] % mod) / dev) + mod;
58 counter[bucket] = arrayAppend(counter[bucket], arr[j]);
59 }
60
61 int pos = 0;
62 for (int[] bucket : counter) {
63 for (int value : bucket) {
64 arr[pos++] = value;
65 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected