|
3 | 3 | import java.util.List; |
4 | 4 |
|
5 | 5 |
|
6 | | -public void cubeSort(int[] arr, int processors) { |
| 6 | +public static void cubeSort(int[] arr, int processors) { |
7 | 7 | int n = arr.length; |
8 | 8 | List<int[]> subarrays = new ArrayList<>(); |
9 | | - int subarraySize = n / processors; |
| 9 | + int subarraySize = (n + processors - 1) / processors; |
10 | 10 |
|
11 | 11 | for (int i = 0; i < processors; i++) { |
12 | | - int[] subarray = Arrays.copyOfRange(arr, i * subarraySize, (i + 1) * subarraySize); |
| 12 | + int[] subarray = new int[Math.min(subarraySize, n - i * subarraySize)]; |
| 13 | + System.arraycopy(arr, i * subarraySize, subarray, 0, subarray.length); |
13 | 14 | Arrays.sort(subarray); |
14 | 15 | subarrays.add(subarray); |
15 | 16 | } |
16 | 17 |
|
17 | 18 | for (int dimension = 0; dimension < Integer.SIZE - 1; dimension++) { |
18 | 19 | for (int i = 0; i < processors; i++) { |
19 | 20 | int partner = i ^ (1 << dimension); |
20 | | - if (i < partner) { |
| 21 | + |
| 22 | + if (i < partner && partner < processors) { |
21 | 23 | int[] merged = merge(subarrays.get(i), subarrays.get(partner)); |
22 | | - subarrays.set(i, Arrays.copyOfRange(merged, 0, subarraySize)); |
23 | | - subarrays.set(partner, Arrays.copyOfRange(merged, subarraySize, merged.length)); |
| 24 | + System.arraycopy(merged, 0, subarrays.get(i), 0, subarraySize); |
| 25 | + System.arraycopy(merged, subarraySize, subarrays.get(partner), 0, subarraySize); |
24 | 26 | } |
25 | 27 | } |
26 | 28 | } |
27 | 29 |
|
28 | 30 | int index = 0; |
| 31 | + |
29 | 32 | for (int[] subarray : subarrays) { |
30 | 33 | for (int num : subarray) { |
31 | 34 | arr[index++] = num; |
32 | 35 | } |
33 | 36 | } |
34 | 37 | } |
35 | 38 |
|
36 | | -public int[] merge(int[] arr1, int[] arr2) { |
| 39 | +public static int[] merge(int[] arr1, int[] arr2) { |
37 | 40 | int[] merged = new int[arr1.length + arr2.length]; |
38 | 41 | int i = 0, j = 0, k = 0; |
39 | 42 |
|
|
0 commit comments