我正在尝试使用mergesort - 我得到 - 来计算列表中拆分反转的数量(也就是说,未排序列表前半部分中的元素应该出现在后半部分中的给定元素之后未排序列表;例如 [3 2 1 4] 将包含拆分反转 (3, 1),但不包含 (3, 2),因为 3 和 2 都在前半部分)。当我到达最终的打印语句时,我得到了我期望的答案——在本例中为 9——但返回值很不稳定,因为它通过递归返回拆分值。我尝试了各种索引组合都无济于事。有什么帮助吗?(使用 Python 2.7)
(为了记录,这是一个 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])