Algorithm
The sorting algorithm you need to implement (rather obscure) is called "flag sorting". Here is what Wikipedia has to say about it:
, radix, . , , . . , .
:
- 4
- 3 ( , )
O(1) , , count[] ..- - , 2
Java
, ; , . .
static void sort(int... arr) {
final int M = 4;
final int N = arr.length;
int[] count = new int[M];
for (int num : arr) {
count[num % M]++;
}
int[] start = new int[M];
for (int i = 1; i < M; i++) {
start[i] = start[i-1] + count[i-1];
}
for (int b = 0; b < M; b++) {
while (count[b] > 0) {
dump(arr);
int origin = start[b];
int from = origin;
int num = arr[from];
arr[from] = -1;
do {
System.out.printf("Picked up %d from [%d]%n", num, from);
int to = start[num % M]++;
count[num % M]--;
System.out.printf("%d moves from [%d] to [%d]%n", num, from, to);
int temp = arr[to];
arr[to] = num;
num = temp;
dump(arr);
from = to;
} while (from != origin);
}
}
}
:
static void dump(int[] arr) {
System.out.println("Array is " + java.util.Arrays.toString(arr));
}
public static void main(String[] args) {
sort(3, 2, 5, 0, 6, 4, 8, 7, 1, 6);
}
:
Array is [3, 2, 5, 0, 6, 4, 8, 7, 1, 6]
Picked up 3 from [0]
3 moves from [0] to [8]
Array is [-1, 2, 5, 0, 6, 4, 8, 7, 3, 6]
Picked up 1 from [8]
1 moves from [8] to [3]
Array is [-1, 2, 5, 1, 6, 4, 8, 7, 3, 6]
Picked up 0 from [3]
0 moves from [3] to [0]
Array is [0, 2, 5, 1, 6, 4, 8, 7, 3, 6]
Array is [0, 2, 5, 1, 6, 4, 8, 7, 3, 6]
Picked up 2 from [1]
2 moves from [1] to [5]
Array is [0, -1, 5, 1, 6, 2, 8, 7, 3, 6]
Picked up 4 from [5]
4 moves from [5] to [1]
Array is [0, 4, 5, 1, 6, 2, 8, 7, 3, 6]
Array is [0, 4, 5, 1, 6, 2, 8, 7, 3, 6]
Picked up 5 from [2]
5 moves from [2] to [4]
Array is [0, 4, -1, 1, 5, 2, 8, 7, 3, 6]
Picked up 6 from [4]
6 moves from [4] to [6]
Array is [0, 4, -1, 1, 5, 2, 6, 7, 3, 6]
Picked up 8 from [6]
8 moves from [6] to [2]
Array is [0, 4, 8, 1, 5, 2, 6, 7, 3, 6]
Array is [0, 4, 8, 1, 5, 2, 6, 7, 3, 6]
Picked up 7 from [7]
7 moves from [7] to [9]
Array is [0, 4, 8, 1, 5, 2, 6, -1, 3, 7]
Picked up 6 from [9]
6 moves from [9] to [7]
Array is [0, 4, 8, 1, 5, 2, 6, 6, 3, 7]
, , ( , ), ( , ).