求逆序对

问题:
对于一个包含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

你可能感兴趣的:(求逆序对)