#分治法解决逆序对问题
class Solution:
def reversePairs(self, record):
def merge_sort(l, r):
# 递归终止条件
if l == r :
return 0
#开始递归划分
m = (l + r) // 2
res = merge_sort(l, m) + merge_sort(m+1, r)
#开始从下往上合并
#复制一个数组tmp,用于临时存储原始元素,
tmp[l : r+1] = record[l : r+1]
#令x, y 指向左右数据的第一个元素
x, y = l, m+1
#循环
for i in range(l,r+1):
if x > m:
#说明左数组遍历完成,只需把右数组剩下的元素添加进去
record[i] = tmp[y]
y += 1
elif y > r:
#说明右数组遍历完成,只需把左数组剩下的元素添加进去
record[i] = tmp[x]
x += 1
elif tmp[y] >= tmp[x]:
#不构成逆序对,将x指向的左数组元素添加进去,然后x右移
record[i] = tmp[x]
x += 1
elif tmp[y] < tmp[x]:
#构成逆序对,并且此时左数组中剩下的元素都构成逆序对
#将y指向的右数组元素添加进去,y右移
record[i] = tmp[y]
y += 1
#记录逆序对数
res += m - x + 1
return res
tmp = [0] * len(record)
return merge_sort(0, len(record) - 1)
record = [12, 14, 53, 8, 74, 23, 17, 66, 70, 9, 34, 75, 90, 34,
98, 50, 86, 94, 3, 67, 73, 79, 43, 66, 19, 20, 57,43, 28, 83]
work = Solution()
num = work.reversePairs(record)
print("逆序对总个数=" + str(num))
逆序对(python)
最新推荐文章于 2024-05-01 01:24:14 发布