You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含奇偶数字的无序列表按奇偶分离并分别排序?

解决奇偶数字分离并分别升序排列的问题

你已经选了双指针的思路来分离奇偶数字,这个方向特别靠谱!先帮你补全那段没写完的交换代码,再加上排序步骤,就能得到你想要的结果啦。

完整实现步骤

  • 第一步:用双指针法把偶数移到列表左侧,奇数移到右侧
  • 第二步:对左侧的偶数子列表和右侧的奇数子列表分别做升序排序

补全并优化后的代码

L = [5,6,4,7,11,14,12,1,3]

def segregateEvenOdd(L):
    left, right = 0, len(L)-1
    while left < right:
        # 左指针向右找第一个奇数
        while L[left] % 2 == 0 and left < right:
            left += 1
        # 右指针向左找第一个偶数
        while L[right] % 2 == 1 and left < right:
            right -= 1
        # 交换元素并移动指针
        if left < right:
            L[left], L[right] = L[right], L[left]
            left += 1
            right -= 1
    return L

# 先完成奇偶分离(用copy避免修改原列表)
segregated_list = segregateEvenOdd(L.copy())
# 找到偶数和奇数的分界点
split_idx = next((i for i, num in enumerate(segregated_list) if num % 2 != 0), len(segregated_list))
# 分别排序后合并
even_sorted = sorted(segregated_list[:split_idx])
odd_sorted = sorted(segregated_list[split_idx:])
final_result = even_sorted + odd_sorted

print(final_result)  # 输出: [4,6,12,14,1,3,5,7,11]

代码说明

  1. 双指针分离逻辑:左指针跳过所有偶数找奇数,右指针跳过所有奇数找偶数,找到后交换两者位置,直到指针相遇,这样就完成了奇偶的原地分离。
  2. 分界点定位:遍历分离后的列表,找到第一个奇数的索引,以此分割出偶数和奇数子列表。
  3. 排序合并:用sorted()分别对两个子列表升序排序,再拼接成最终结果。

如果你追求更简洁的写法,其实可以跳过双指针分离,直接筛选奇偶再排序合并,可读性更高,一般规模的列表效率也足够:

L = [5,6,4,7,11,14,12,1,3]
even = sorted([num for num in L if num % 2 == 0])
odd = sorted([num for num in L if num % 2 != 0])
final_result = even + odd
print(final_result)  # 同样得到预期输出

内容的提问来源于stack exchange,提问作者PGS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:06:10