稳定奇偶重排是将奇数置前、偶数置后且各自相对顺序不变的操作;php中可用两次遍历+辅助数组(推荐)或单次遍历+动态追加实现,前者时间o(n)、空间o(n),后者因array_unshift导致最坏o(n²)。

将数组中奇数放在前面、偶数放在后面,同时保持各自内部的相对顺序不变,这种操作叫“稳定奇偶重排”。PHP 中没有内置函数直接实现,但可以通过一次遍历+辅助数组或双指针原地调整来完成。
方法一:两次遍历 + 辅助数组(推荐,逻辑清晰)
这是最直观、不易出错的方式。先扫一遍收集所有奇数,再扫一遍收集所有偶数,合并即可。时间复杂度 O(n),空间复杂度 O(n)。
示例代码:
function reorderOddEven($arr) {
$odd = [];
$even = [];
foreach ($arr as $v) {
if ($v % 2 !== 0) {
$odd[] = $v;
} else {
$even[] = $v;
}
}
return array_merge($odd, $even);
}
// 测试
print_r(reorderOddEven([1, 2, 3, 4, 5, 6])); // [1, 3, 5, 2, 4, 6]
方法二:单次遍历 + 动态追加(节省一次循环)
在一次遍历中,遇到奇数就 前插 到结果数组开头,偶数则 后追加。注意 PHP 的 array_unshift() 效率较低(O(n)),适合小数组;大数组慎用。
立即学习“PHP免费学习笔记(深入)”;
- 优点:只遍历一次,代码紧凑
- 缺点:
array_unshift()在内部会移动所有已有元素,整体退化为 O(n²) - 适用场景:教学演示或数据量很小(
方法三:双指针原地重排(不保持稳定性)
若不要求奇数/偶数各自的原始顺序,可用左右双指针原地交换,空间复杂度 O(1),时间 O(n)。但该方式会打乱原有次序,例如 [1,2,3,4] 可能变成 [1,3,4,2]。
关键逻辑:
- 左指针从头找偶数,右指针从尾找奇数
- 找到后交换,继续向中间收缩
- 直到两指针相遇
注意事项与边界处理
实际使用时需考虑这些细节:
- 空数组或单元素数组直接返回,避免冗余操作
- 负数判断奇偶用
$n % 2 !== 0更稳妥(因 -3 % 2 在 PHP 中为 -1) - 浮点数需先
is_int()或floor()处理,否则3.0 % 2可能报 warning - 非数字元素(如字符串 "5")建议提前
filter_var($v, FILTER_VALIDATE_INT)校验











