Question
Given an array A[] consisting 0s, 1s and 2s, write a function that sorts A[]. The functions should put all 0s first, then all 1s and all 2s in last.
Example
Input = {0, 1, 1, 0, 1, 2, 1, 2, 0, 0, 0, 1};
Output = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2}
Solution
3-way sort: http://www.geeksforgeeks.org/3-way-quicksort-dutch-national-flag/
Code
public int[] threePointerSort(int[] input) {
if (input == null || input.length <= 1) {
return input;
}
// left is at the leftmost non-0 position
// right is at rightmost non-2
// mid is currently being evaluated (before mid, it's sorted)
int left = 0, right = input.length - 1;
int mid = left;
while (mid <= right) {
if (input[mid] > 1) {
Common.swap(input, mid, right);
right--;
} else if (input[mid] < 1) {
Common.swap(input, left, mid);
left++;
mid++;
} else {
mid++;
}
}
return input;
}