「归并排序」与「逆序对」是息息相关的。归并排序体现了 “分而治之” 的算法思想,具体为:
分: 不断将数组从中点位置划分开(即二分法),将整个数组的排序问题转化为子数组的排序问题;
治: 划分到子数组长度为 1 时,开始向上合并,不断将 较短排序数组 合并为 较长排序数组,直至合并至原数组时完成排序;
在归并排序的过程中 后一个数组的数如小于前一个数组的数,则一定能够构成逆序对且逆序对的数目可计算,因为待归并的两个数组提前已经归并排序过,所以不会出现像前面那样少统计或者多统计的情况出现。
思路:[A,B]中的逆序对=[A]的逆序对+[B]中的逆序对+将A,B混排在一起的逆序对
# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.cnt = 0
    def MergeSort(self, data, start, end):
        if len(data)<2:
            return data
        if start >= end:
            return 
        mid = (start + end)//2
        self.MergeSort(data, start, mid)
        self.MergeSort(data, mid+1, end)
        self.MergeOne(data, start, mid, end)
    def MergeOne(self, data, start, mid, end):
        temp = [0]*(end-start+1)
        k=0
        i= start
        j =mid+1
        while i <= mid and j <=end:
            if data[i] <= data[j]:
                temp[k] = data[i]
                k +=1
                i +=1
            else:
                
                temp[k] = data[j]
                k +=1
                j +=1
                self.cnt = (self.cnt+(mid-i+1))%1000000007
        while i <= mid:
            
            temp[k] = data[i]
            k +=1
            i +=1
        while j <= end:
            temp[k] = data[j]
            k +=1
            j +=1
            
        for l in range(0,k):
            data[start+l] = temp[l]
                
    def InversePairs(self, data):
        # write code here
        if len(data) < 2: return 0
        self.MergeSort(data, 0, len(data)-1)
        return  self.cnt
参考资料:https://blog.nowcoder.net/n/b875de41e34d44e2958f36aff86ff383?f=comment