问题:
对于一个包含N个非负整数的数组A[1..n],如果有i < j,且A[ i ]>A[ j ],则称(A[ i] ,A[ j] )为数组A中的一个逆序对。
例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个。
给定一个数组,求该数组中包含多少个逆序对。
要求时间复杂度为nlog(n)
方法一:
暴力求解,以每一个数做基准,搜索后面的内容,对比大小。时间复杂度O(n**2)
方法二:
借助归并排序的思想,在每次合并时,两个子序列都是有序的,当有一个能组成逆序对时,则后续的都可以组成,此时count + len(list_children)
co = 0
def merge_sort(l):
if len(l) < 2:
return l
mid = len(l) // 2
left = merge_sort(l[:mid])
right = merge_sort(l[mid:])
return merge(left, right)
def merge(l1, l2):
global co
c = []
i= j = 0
while i< len(l1) and j < len(l2):
if l1[i] <= l2[j]:
c.append(l1[i])
i+= 1
else:
co += len(l1) - i
c.append(l2[j])
j += 1
if i < len(l1):
c.extend(l1[i:])
else:
c.extend(l2[j:])
return c