public static void teePaarisPaaritud(int[] a){
teePaarisPaaritudRek(a, 0);
}
private static void teePaarisPaaritudRek(int[] a, int i) {
if(i == a.length-1) return;
if(a[i] % 2 != 0){
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
teePaarisPaaritudRek(a, i+1);
}
teePaarisPaaritudRek(a, i+1);
}
我写了这个递归方法。预期的功能是通过将偶数元素移到前面并将奇数元素移到后面来对 int[] 进行排序,同时保持偶数元素和奇数元素之间的原始顺序。例如,输入 int[] a = {-1,0,-7,3,10,4,0,2,-1,-5,6} 输出应为 [0,10,4,0 ,2,6,−1,−7,3,−1,−5]。然而我的代码有点偏离目标,我得到的输出是 [0, 10, 4, 0, 2, 6, -7, 3, -1, -5, -1] 。
正如你所看到的,第二个-1在后面,但它应该在-7之前。我尝试将基数设置为 if(i == a.length-2) return;但这没有用,因为这样最终 6 就会保留下来。仅当输入数组的长度为偶数时,才会出现此问题。
我知道你想使用递归,但我觉得你也应该使用 for 循环。
import java.util.*;
public class StackOverFlow {
public static void teePaarisPaaritud(int[] a) {
teePaarisPaaritudRek(a, 0);
}
private static void teePaarisPaaritudRek(int[] a, int i) {
if (i == a.length - 1)
return;
if ((a[i] & 1) == 1) { // this is a small java bitwise trick to help faster code checks the same thing
for (int j = i + 1; j < a.length; j++) {
if ((a[j] & 1) == 0) {
int temp = a[j];
for (int k = j; k > i; k--) {
a[k] = a[k - 1];
}
a[i] = temp;
break;
}
}
}
teePaarisPaaritudRek(a, i + 1);
}
}