求逆序对

问题:
对于一个包含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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容