以下内容应该具有启发性。这是一个递归的O(N)
解决方案,它可以重新排列前面的偶数和后面的奇数,但不会做任何排序。
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);
} // prints "[6, 4, 2, 7, 5, 3, 1]"
我认为三元操作使得递归流更自然,但如果你不与它的工作原理是舒服,你可以用传统的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);
}
}
嗯......如果你用record = false来调用它,它什么也不做。如果你用recursed = true调用它,它将永远递归。 – Oddthinking 2010-04-27 01:51:12