リスト内の分割反転の数をカウントするために、マージソートを使用しようとしています(つまり、ソートされていないリストの前半の要素が、リストの後半の特定の要素の後に表示される必要があります)。ソートされていないリスト; たとえば、[3 2 1 4] には分割反転 (3, 1) が含まれますが、3 と 2 は両方とも前半にあるため (3, 2) は含まれません)。最後の print ステートメントにたどり着くと、期待どおりの答え (この場合は 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])