「归并排序」与「逆序对」是息息相关的。归并排序体现了 “分而治之” 的算法思想,具体为:
分: 不断将数组从中点位置划分开(即二分法),将整个数组的排序问题转化为子数组的排序问题;
治: 划分到子数组长度为 1 时,开始向上合并,不断将 较短排序数组 合并为 较长排序数组,直至合并至原数组时完成排序;
治: 划分到子数组长度为 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