defsmallsum(arr, l, r):if l == r:return0
mid =(l + r)>>1return smallsum(arr, l, mid)+ smallsum(arr, mid +1, r)+ merge(arr, l, mid, r)defmerge(arr, start, mid, end):
l, r = start, mid+1
result =[]sum=0while l <= mid and r <= end:if arr[l]< arr[r]:sum+= arr[l]*(end - r +1)
result.append(arr[l])
l +=1else:
result.append(arr[r])
r +=1while l <= mid:
result.append(arr[l])
l +=1while r <= end:
result.append(arr[r])
r +=1for i inrange(len(result)):
arr[start+i]= result[i]returnsumif __name__ =='__main__':
list1 =[1,4,3,2,5]
a = smallsum(list1,0,len(list1)-1)print(a)
defReversePair(list1, l, r):if l==r:return0
mid =(l + r)>>1
left = ReversePair(list1, l, mid)
right = ReversePair(list1, mid +1, r)return left + right + merge(list1, l, mid, r)defmerge(list1, start, mid, end):
l, r = start, mid +1
Sum =0
result =[]while l <= mid and r <= end:if list1[l]> list1[r]:
Sum +=1*(end - r+1)print("逆序对为",list1[l],list1[r:end+1])
result.append(list1[l])
l +=1else:
result.append(list1[r])
r +=1while l <= mid:
result.append(list1[l])
l +=1while r <= end:
result.append(list1[r])
r +=1for i inrange(len(result)):
list1[i+start]= result[i]return Sum
if __name__ =='__main__':
list1 =[7,5,6,4]# list1 = [2,4,3,5,1]
a = ReversePair(list1,0,len(list1)-1)# print(list1)print("逆序对总数为:",a)