我正在尝试使用归并排序来计算列表中的拆分逆序对数量(即未排序列表的前半部分中的元素应在未排序列表的后半部分中的给定元素之后出现;例如,[3 2 1 4] 将包含拆分逆序对 (3, 1),但不是包含 (3, 2) ,因为 3 和 2 都在第一半)。当我到达最终的打印语句时,我得到了期望的答案--在这种情况下是9--但返回值很奇怪,因为它通过递归返回分裂值。我尝试了各种组合的索引,但无济于事。有什么帮助吗?(使用Python 2.7)
(顺便说一句,这是Coursera的作业问题,但我只是为了乐趣而学习--除了我之外没有人评分。)
(顺便说一句,这是Coursera的作业问题,但我只是为了乐趣而学习--除了我之外没有人评分。)
def mergesort(lst):
'''Recursively divides list in halves to be sorted'''
if len(lst) is 1:
return lst
middle = int(len(lst)/2)
left = mergesort(lst[:middle])
right = mergesort(lst[middle:])
sortedlist = merge(left, right)
return sortedlist
def merge(left, right):
'''Subroutine of mergesort to sort split lists. Also returns number
of split inversions (i.e., each occurence of a number from the sorted second
half of the list appearing before a number from the sorted first half)'''
i, j = 0, 0
splits = 0
result = []
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
splits += len(left[i:])
result += left[i:]
result += right[j:]
print result, splits
return result, splits
print mergesort([7,2,6,4,5,1,3,8])