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

如何从返回元组提取换位次数以判断排列奇偶性

判断排列奇偶性:从归并排序统计中获取换位次数

首先,先搞懂你代码里的核心逻辑:你用归并排序的分治思路统计的b+c+d其实是数组的逆序数,而逆序数的奇偶性正好对应排列的奇偶性——逆序数是偶数就是偶排列,奇数就是奇排列。

你现在遇到的问题主要是两个:一是不知道怎么从SortCount返回的元组里拿到逆序数,二是修改返回语句会报错。我给你一步步拆解:

1. 怎么获取元组里的逆序数?

你的SortCount函数返回的是一个元组,第一个元素是排序后的数组,第二个就是你要的总逆序数(也就是b+c+d)。调用函数的时候,你可以把这两个值分别赋值给两个变量,就像这样:

# 举个例子,测试数组
my_permutation = [3, 1, 2]
# 解包元组:第一个变量存排序后的数组,第二个存逆序数
sorted_arr, total_inversions = SortCount(my_permutation)
# 然后判断奇偶性:偶数就是偶排列,返回True;奇数是奇排列,返回False
is_even = total_inversions % 2 == 0
print(is_even)  # 这个例子逆序数是2,输出True

2. 为什么修改原函数返回会报错?

你尝试修改SortCount的返回语句导致报错,是因为这个函数是递归调用的:在C, c = SortCount(A[:n])和D, d = SortCount(A[n:])这两行,递归调用需要同时拿到排序后的子数组和子数组的逆序数——前者要传给MergeCount做合并,后者要用来计算总逆序数。

如果你直接把返回改成只返回奇偶性(比如return (b+c+d)%2),或者把逆序数改成奇偶值返回,递归的时候就会因为解包失败(或者拿到的子问题逆序数不对)而报错。

3. 推荐的解决方案:封装外层函数

最灵活的做法是保留原SortCount的功能(毕竟它还能帮你排序和统计逆序数),然后写一个专门判断奇偶排列的外层函数,这样调用起来更方便:

完整代码如下:

def MergeCount(A,B):
    count = 0
    M = []
    while A and B:
        if A[0] <= B[0]:
            M.append(A.pop(0))
        else:
            count += len(A)
            M.append(B.pop(0))
    M += A + B
    return M, count

def SortCount(A):
    l = len(A)
    if l > 1:
        n = l//2
        C, c = SortCount(A[:n])
        D, d = SortCount(A[n:])
        B, b = MergeCount(C,D)
        return B, b+c+d
    else:
        return A, 0

# 专门判断排列奇偶性的函数
def IsEvenPermutation(arr):
    # 用下划线_表示我们不需要排序后的数组,只取逆序数
    _, total_inversions = SortCount(arr)
    # 逆序数为偶数返回True(偶排列),否则返回False(奇排列)
    return total_inversions % 2 == 0

# 测试一下
test1 = [2, 1, 3]  # 逆序数1,奇排列,应该返回False
print(IsEvenPermutation(test1))  # 输出False

test2 = [4, 3, 2, 1]  # 逆序数6,偶排列,应该返回True
print(IsEvenPermutation(test2))  # 输出True

这样你以后只需要调用IsEvenPermutation(你的排列数组),就能直接得到你想要的True/False结果啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:37:45