The following should be instructive. This is a recursive O(N) solution that rearranges even numbers in the front and odd numbers in the back, but does not make any orders outside of this.
static boolean isEven(int n) { return (n & 1) == 0; } static boolean isOdd(int n) { return !isEven(n); } static int[] swapped(int[] nums, int i, int j) { int t = nums[i]; nums[i] = nums[j]; nums[j] = t; return nums; } static int[] arrange(int[] nums, int lo, int hi) { return (lo >= hi) ? nums : (isEven(nums[lo])) ? arrange(nums, lo + 1, hi) : (isOdd(nums[hi])) ? arrange(nums, lo, hi - 1) : arrange(swapped(nums, lo, hi), lo + 1, hi - 1); } static void evenOddSort(int... nums) { System.out.println(java.util.Arrays.toString( arrange(nums, 0, nums.length - 1) )); } public static void main(String[] args) { evenOddSort(1,3,5,7,2,4,6); }
I think the ternary operator makes the recursion stream more natural, but if you don't like the way it works, you can just use the traditional if-else .
static int[] arrange(int[] nums, int lo, int hi) { if (lo >= hi) { return nums; } else if (isEven(nums[lo])) { return arrange(nums, lo + 1, hi); } else if (isOdd(nums[hi])) { return arrange(nums, lo, hi - 1); } else { return arrange(swapped(nums, lo, hi), lo + 1, hi - 1); } }