合并排序python中的反转数

Posted

技术标签:

【中文标题】合并排序python中的反转数【英文标题】:Number of Inversions in Merge Sort python 【发布时间】:2021-10-28 22:18:36 【问题描述】:

我正在尝试计算合并排序算法中的反转次数。除了为条件添加一个计数器以在右侧的值小于左侧的值时翻转值之外,我没有进行很多修改。我正在使用的代码如下,它甚至可以在 pythontutor.com 上打印正确的答案,但也会产生错误。我无法理解的是错误的来源。这里有人能解释一下我没有看到什么吗?我的代码和错误如下:

def merge(left,right):
    result=[]
    i,j=0,0
    count=0
    while (i<len(left)) and (j<len(right)):
      if left[i]<right[j]:
          result.append(left[i])
          count+=1
          i+=1
      else:
          result.append(right[j])
          j+=1

    while (i<len(left)):
      result.append(left[i])
      i+=1

    while (j<len(right)):
      result.append(right[j])
      j+=1
   # print(count)
 return result,count

def merge_sort(list):
    if len(list)<2:
        return list
    else:
        middle=len(list)//2
        left=merge_sort(list[:middle])
        right=merge_sort(list[middle:])
        # return merge(left,right)
        result,count=merge(left,right)
        print(result,count)

merge_sort([2,3,9,2,9])

我得到的错误是:

TypeError: object of type 'NoneType' has no len()

【问题讨论】:

我认为缩进是错误的。可能在复制过程中出了点问题。 是的,缩进不是问题。 *** 只是不允许我在复制时缩进代码。 【参考方案1】:

您的问题出在 merge_sort 函数的 else 块中 - 您永远不会返回您的列表,因此 Python 会隐式返回 None。你想要这样的东西:

left,   left_count  = merge_sort(list[:middle])
right,  right_count = merge_sort(list[middle:])
result, merge_count = merge(left, right)

count = left_count + right_count + merge_count
return result, count

另外:您不应该使用内置类型(例如“list”)作为变量名,因为它们会影响实际类型。

【讨论】:

我的最终目标是计算反转次数。返回结果肯定会给我一个排序的数组,而不是反转的数量。这就是我卡住的地方。 对。相同的概念适用-您需要同时返回两者。现在你什么都不返回,所以你的递归调用返回None,给出异常。 老兄,我不知道该怎么感谢你。你是救生员。在过去的 3 天里,我确实被困在这个问题上,由于某种原因看不到错误。我现在确实看到了。 @HaseebKhan 很高兴听到它现在有意义。如果这解决了您的问题,您可能希望接受答案以明确表明该问题不再开放

以上是关于合并排序python中的反转数的主要内容,如果未能解决你的问题,请参考以下文章

我无法在合并排序中使用java获得反转次数

为啥合并排序用于 Android/Java API 中的对象?

python 使用python3中的队列合并排序

python的排序算法大汇总「附一套python资料视频

python语句中合并两个列表并且将列表中的数安大小排列

在python中,如i=