# -*- coding:utf-8 -*-
class Solution:
def InversePairs(self, data):
# write code here
#用归并排序,归并拼接后用计算排序时元素的index变动了少
_,s=self.MergeSort(data)
return s%1000000007
def MergeSort(self,data):
n=len(data)
#递归基
if n==1:return data, 0
#分两半来排序
part1,part2=data[:n//2],data[n//2:]
sorted_part1,s1=self.MergeSort(part1)
sorted_part2,s2=self.MergeSort(part2)
#排序后拼接这两半,拼接后先计数,然后将两个有序序列合并
s,sorted_temp=0,sorted_part1+sorted_part2
#用p、q两个指针指向两段,计算q中每个元素离插入点的index差
p,q,len1,len_all=0,sorted_temp.index(sorted_part2[0]),len(sorted_part1),len(sorted_temp)
while p
#移动p使p成为插入排序的插入点,计算要移动多少个位置
while p
if sorted_temp[q]
s+=len1-p
break
p+=1
q+=1
#完成排序,并把排序后的内容回溯给上一级做准备
l=[]
p,q=0,sorted_temp.index(sorted_part2[0])
while p
if sorted_temp[p]
l.append(sorted_temp[p])
p+=1
else:
l.append(sorted_temp[q])
q+=1
if p==len1:l+=sorted_temp[q:]
if q==len_all:l+=sorted_part1[p:]
return l,s+s1+s2