java数组奇偶重排序核心是将偶数置前、奇数置后,常用双指针原地调整(o(1)空间)和额外数组辅助(o(n)空间)两种方法;双指针法通过left找奇数、right找偶数并交换实现分组,负数按数学奇偶性处理,零视为偶数。

Java 中数组按奇偶数重新排序,核心思路是把所有偶数放在前面、奇数放在后面(或反过来),不一定要完全升序,只需满足奇偶分组。常用方法有双指针原地调整和额外空间辅助两种,下面分别说明。
双指针法(原地排序,空间 O(1))
适用于整型数组,不改变偶数/奇数内部顺序时可用「稳定」变体;若只关心分组,推荐经典双指针:左指针找奇数,右指针找偶数,交换后继续收缩。
- 初始化 left = 0,right = 数组长度 - 1
- left 向右移动直到遇到奇数,right 向左移动直到遇到偶数
- 若 left
- 循环直到 left >= right
示例代码片段:
int[] arr = {1, 2, 3, 4, 5, 6};
int left = 0, right = arr.length - 1;
while (left 使用 ArrayList 分离再合并(稳定且易懂)
如果需要保持偶数、奇数各自的原始相对顺序(稳定排序),用两个列表分别收集,再合并。
- 遍历原数组,偶数 add 到 evenList,奇数 add 到 oddList
- 清空原数组或新建结果数组,先写入 evenList 所有元素,再写入 oddList
- 适合对稳定性有要求,或不想直接操作索引的场景
借助 Stream(Java 8+,函数式风格)
一行流式写法简洁,但会生成新数组,不修改原数组。
- 用 filter 分别筛选偶数和奇数
- 用 Stream.concat 拼接,再转为数组
- 注意:int[] 需用 mapToInt 转换,避免装箱开销
示例:
int[] arr = {1, 2, 3, 4, 5, 6};
int[] result = Stream.concat(
Arrays.stream(arr).filter(x -> x % 2 == 0),
Arrays.stream(arr).filter(x -> x % 2 != 0)
).toArray();
// result = [2, 4, 6, 1, 3, 5]
注意事项
负数处理:Java 中负数取模结果可能为负(如 -3 % 2 == -1),判断奇偶建议用 (x & 1) == 0 更安全,或用 Math.abs(x) % 2;但通常业务中奇偶定义以数学奇偶为准,-2、-4 是偶数,-1、-3 是奇数,直接 x % 2 == 0 仍适用。
零是偶数,会被归入偶数分组,无需特殊处理。
空数组或单元素数组直接返回,双指针循环不会执行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











