-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRadixBit.java
More file actions
52 lines (45 loc) · 1.32 KB
/
RadixBit.java
File metadata and controls
52 lines (45 loc) · 1.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.LinkedList;
import java.util.List;
public class RadixBit {
public static void sort(int[] input) {
// initialization
byte bits = maxBits(input);
int exp = 1;
List<Integer> l = new LinkedList<>();
List<Integer> r = new LinkedList<>();
// loop through all set bits
for (int i = 0; i < bits; i++) {
l.clear();
r.clear();
// sort numbers into buckets based on if their bit at i is set
for (int in : input) {
if ((in & exp) == 0)
l.add(in);
else
r.add(in);
}
// shift over to next bit
exp = exp << 1;
// merge buckets
l.addAll(r);
// reconstruct input
int idx = 0;
for (Integer sol : l) {
input[idx] = sol;
idx++;
}
}
}
// computes the highest set bit
private static byte maxBits(int[] nums) {
int exp = 1 << 31;
for (byte i = 32; i > 0; i--) {
for (int num : nums) {
if ((exp & num) != 0)
return i;
}
exp = exp >>> 1;
}
return 0;
}
}