You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归数组奇偶排序问题:偶数前置但奇数相对顺序异常

修正递归实现稳定奇偶分区的问题

你的递归逻辑存在两个核心问题,导致奇数的原始相对顺序被打乱:

  • 遇到奇数就与下一个元素交换的操作,会反转相邻奇数的顺序(比如原序列中的-1和-7,交换过程中-7会跑到-1前面)。
  • 每次交换后连续两次调用teePaarisPaaritudRek(a, i+1),会导致同一位置元素被重复处理,加剧顺序混乱。

要实现稳定的奇偶分区(保持偶数、奇数各自的原始相对顺序),递归思路需要调整:找到第一个奇数,再定位它后方第一个偶数,将该偶数移动到当前奇数的位置,同时把中间的奇数依次后移一位,之后递归处理下一个位置。

修正后的代码

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) {
        teePaarisPaaritudRek(a, i + 1);
        return;
    }

    // 当前元素是奇数,查找后方第一个偶数的位置
    int j = i + 1;
    while (j < a.length && a[j] % 2 != 0) {
        j++;
    }

    // 若后方无偶数,说明剩余都是奇数,直接返回
    if (j == a.length) {
        return;
    }

    // 暂存找到的偶数,将i到j-1的奇数依次后移一位
    int evenNum = a[j];
    for (int k = j; k > i; k--) {
        a[k] = a[k - 1];
    }
    // 将偶数放到当前奇数的位置
    a[i] = evenNum;

    // 递归处理下一个位置
    teePaarisPaaritudRek(a, i + 1);
}

代码说明

  • 遇到偶数时直接跳过,递归处理下一个元素,保证偶数的原始顺序不受影响。
  • 遇到奇数时,通过后移中间奇数的方式将后方第一个偶数移到当前位置,中间的奇数仅整体后移,相对顺序完全保留。
  • 每次处理完当前位置后递归推进,逐步完成整个数组的分区。

测试你提供的输入数组int[] a = {-1,0,-7,3,10,4,0,2,-1,-5,6},运行后会得到预期输出:[0,10,4,0,2,6,-1,-7,3,-1,-5]。

内容的提问来源于stack exchange,提问作者user1263607

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:55:19