2
2
3
3
import java .util .Arrays ;
4
4
5
- /**
6
- * BeadSort cannot sort negative numbers, characters, or strings.
7
- * It only works for non-negative integers.
8
- *
9
- * @see <a href="https://en.wikipedia.org/wiki/Bead_sort">BeadSort Algorithm (Wikipedia)</a>
10
- */
11
5
public class BeadSort {
12
6
/**
13
7
* Sorts the given array using the BeadSort algorithm.
@@ -17,37 +11,47 @@ public class BeadSort {
17
11
* @throws IllegalArgumentException If the array contains negative numbers.
18
12
*/
19
13
public int [] sort (int [] array ) {
20
- if (array . length == 0 ) {
21
- return array ;
22
- }
14
+ allInputsMustBeNonNegative (array );
15
+ return extractSortedFromGrid ( fillGrid ( array )) ;
16
+ }
23
17
18
+ private void allInputsMustBeNonNegative (final int [] array ) {
24
19
if (Arrays .stream (array ).anyMatch (s -> s < 0 )) {
25
20
throw new IllegalArgumentException ("BeadSort cannot sort negative numbers." );
26
21
}
22
+ }
27
23
28
- int [] sorted = new int [array .length ];
29
- int max = Arrays .stream (array ).max ().orElse (0 );
30
-
31
- char [][] grid = new char [array .length ][max ];
32
- int [] count = new int [max ];
33
-
34
- for (int i = 0 ; i < array .length ; i ++) {
35
- for (int j = 0 ; j < max ; j ++) {
36
- grid [i ][j ] = '-' ;
37
- }
38
- }
24
+ private boolean [][] fillGrid (final int [] array ) {
25
+ final var maxValue = Arrays .stream (array ).max ().orElse (0 );
26
+ var grid = getEmptyGrid (array .length , maxValue );
39
27
28
+ int [] count = new int [maxValue ];
40
29
for (int i = 0 , arrayLength = array .length ; i < arrayLength ; i ++) {
41
30
int k = 0 ;
42
31
for (int j = 0 ; j < array [i ]; j ++) {
43
- grid [count [max - k - 1 ]++][k ] = '*' ;
32
+ grid [count [maxValue - k - 1 ]++][k ] = true ;
44
33
k ++;
45
34
}
46
35
}
36
+ return grid ;
37
+ }
38
+
39
+ private boolean [][] getEmptyGrid (final int arrayLength , final int maxValue ) {
40
+ boolean [][] grid = new boolean [arrayLength ][maxValue ];
41
+ for (int i = 0 ; i < arrayLength ; i ++) {
42
+ for (int j = 0 ; j < maxValue ; j ++) {
43
+ grid [i ][j ] = false ;
44
+ }
45
+ }
46
+
47
+ return grid ;
48
+ }
47
49
48
- for (int i = 0 ; i < array .length ; i ++) {
50
+ private int [] extractSortedFromGrid (final boolean [][] grid ) {
51
+ int [] sorted = new int [grid .length ];
52
+ for (int i = 0 ; i < grid .length ; i ++) {
49
53
int k = 0 ;
50
- for (int j = 0 ; j < max && grid [array .length - 1 - i ][j ] == '*' ; j ++) {
54
+ for (int j = 0 ; j < grid [ grid . length - 1 - i ]. length && grid [grid .length - 1 - i ][j ]; j ++) {
51
55
k ++;
52
56
}
53
57
sorted [i ] = k ;
0 commit comments