1. 项目背景与核心需求
"左边奇数右边偶数"这个看似简单的排列问题,实际上涉及数据结构处理、算法优化和边界条件处理等多个编程核心技能。我在处理大规模数据排序任务时,发现这类基础问题的解决质量直接影响整体系统性能。通过这个项目,我们将实现一个高效、稳定的数组重排方案,满足以下核心需求:
- 输入一个包含整数的数组
- 将所有奇数置于数组左侧
- 将所有偶数置于数组右侧
- 保持奇数/偶数各自的原始相对顺序
- 时间复杂度控制在O(n),空间复杂度尽量优化
这个需求在数据处理流水线、缓存优化等场景中十分常见。比如电商平台的商品推荐系统需要将高优先级商品(用奇数ID表示)前置展示,而日志分析系统可能需要将错误日志(偶数编号)集中处理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与实现方案
2.1 双指针法实现
最直观的解决方案是使用双指针技术,以下是经过生产环境验证的实现代码(Python示例):
python复制def odd_even_sort(arr):
left, right = 0, len(arr) - 1
while left < right:
# 左指针找偶数
while left < right and arr[left] % 2 != 0:
left += 1
# 右指针找奇数
while left < right and arr[right] % 2 == 0:
right -= 1
# 交换位置
if left < right:
arr[left], arr[right] = arr[right], arr[left]
return arr
关键点:这种实现会改变元素的原始相对顺序,不符合我们的需求。但它的时间复杂度是理想的O(n),空间复杂度O(1)。
2.2 保持相对顺序的稳定排序
为了保持原始顺序,我们需要采用类似稳定排序的方法。以下是改进方案:
python复制def stable_odd_even_sort(arr):
odd = [x for x in arr if x % 2 != 0]
even = [x for x in arr if x % 2 == 0]
return odd + even
虽然代码简洁,但存在两个问题:
- 空间复杂度升至O(n)
- 需要两次完整遍历(列表推导式)
2.3 最优解:单次遍历双数组法
结合前两种方案的优点,最终实现如下:
python复制def optimized_sort(arr):
odd, even = [], []
for num in arr:
if num % 2 != 0:
odd.append(num)
else:
even.appen
