如何从返回元组提取换位次数以判断排列奇偶性
判断排列奇偶性:从归并排序统计中获取换位次数
首先,先搞懂你代码里的核心逻辑:你用归并排序的分治思路统计的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
相关产品推荐
相关产品推荐

