逆序对(python)

#分治法解决逆序对问题
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))

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值