递归数组奇偶排序问题:偶数前置但奇数相对顺序异常
修正递归实现稳定奇偶分区的问题
你的递归逻辑存在两个核心问题,导致奇数的原始相对顺序被打乱:
- 遇到奇数就与下一个元素交换的操作,会反转相邻奇数的顺序(比如原序列中的
-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
相关产品推荐
相关产品推荐

