PHP 数组按奇偶分区算法

6次阅读

数组奇偶分区是将整数数组重排为偶数在前、奇数在后,常用双指针法:左指针找奇数、右指针找偶数,相遇前交换,时间 o(n)、空间 o(1)。

PHP 数组按奇偶分区算法

什么是数组奇偶分区

数组奇偶分区是指将一个整数数组重新排列,使得所有偶数排在前面,所有奇数排在后面(或反之),不要求保持原有顺序,但通常要求原地完成、时间复杂度 O(n)、空间复杂度 O(1)。

双指针法(推荐)

使用左右两个指针从数组两端向中间扫描,左指针找奇数,右指针找偶数,找到后交换。这是最常用且高效的方法。

  • 初始化 $left = 0$right = count($arr) – 1
  • $left 时循环:
    • 左指针向右移动,跳过偶数($arr[$left] % 2 == 0
    • 右指针向左移动,跳过奇数($arr[$right] % 2 == 1
    • 若两指针未相遇,交换 $arr[$left]$arr[$right]

  • 循环结束后,数组完成分区:左侧全为偶数,右侧全为奇数

单次遍历法(稳定分区,可选)

如果希望保持偶数 / 奇数内部的相对顺序(即“稳定”分区),可用额外数组或插入式逻辑,但会牺牲空间或时间效率。常见做法是:

  • 新建两个空数组:$evens = []$odds = []
  • 遍历原数组,根据 $num % 2 === 0 分别追加到对应数组
  • 合并:array_merge($evens, $odds)

该方法时间复杂度 O(n),空间复杂度 O(n),适合对稳定性有要求且不严格限制内存的场景。

立即学习 PHP 免费学习笔记(深入)”;

注意事项与边界处理

实际编码中需注意以下细节:

  • 空数组或单元素数组直接返回,避免越界访问
  • 判断奇偶用 % 2 === 0 更安全(避免负数取模结果歧义;PHP 中负数 % 2 可能为 -1,建议用 abs($n) % 2$n & 1 判断奇数)
  • 若要求奇数在前、偶数在后,只需调换判断逻辑(左找偶、右找奇)
  • 原地交换时确保 $left !== $right 再交换,避免自交换
text=ZqhQzanResources