合并排序中的反转次数 python
Number of Inversions in Merge Sort python
我正在尝试计算合并排序算法中的倒置次数。除了为条件添加一个计数器以在右侧的值小于左侧的值时翻转值外,我没有做太多修改。我正在使用的代码如下,它甚至在 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()
您的问题出在 merge_sort
函数的 else
块中 - 您从未 return 您的列表,因此 Python 隐式 returns 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”)作为变量名,因为它们掩盖了实际类型。
我正在尝试计算合并排序算法中的倒置次数。除了为条件添加一个计数器以在右侧的值小于左侧的值时翻转值外,我没有做太多修改。我正在使用的代码如下,它甚至在 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()
您的问题出在 merge_sort
函数的 else
块中 - 您从未 return 您的列表,因此 Python 隐式 returns 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”)作为变量名,因为它们掩盖了实际类型。