计算逆序对pytho(数据结构与算法)

题目

如果一个数组已经排好序,当是升序的时候,那么逆序对个数为0,当时降序的时候,那么逆序对的个数最多。

对数组进行逆序对计算的意义:距离数组的排序的距离多远。

例如:

3,5,1,4,7,有三个逆序对,(3,1),(5,1),(5,4)

方法1 

两个循环,时间复杂度为O(n^2)

def countInver(nums):
    n = len(nums)
    count = 0
    for i in range(n):
        for j in range(i+1,n):
            if (nums[i] > nums[j]):
                count += 1
    return count

arr = [3,5,1,4,7]
countInver(arr)
Out[18]: 3

方法2 二分法+归并排序

其实这种方法就是在归并排序中,添加计算逆序的计数过程。

def merge(left,right):
    result = list()
    i,j = 0,0
    count = 0
    while i < len(left) and j < len(right) :
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        elif right[j] < left[i]:
            result.append(right[j])
            j += 1
            count += (len(left) - i)#已排好序
    result += left[i:]
    result += right[j:]
    return result,count


#O(nlogn)
def countInvFast(arr):
    if len(arr) < 2:
        return arr,0
    middle = len(arr) // 2
    left,inv_left = countInvFast(arr[:middle])
    right,inv_right = countInvFast(arr[middle:])
    merged,count = merge(left,right)
    count += (inv_left + inv_right)
    return merged,count


arr = [3,5,1,4,7]
countInvFast(arr)
Out[28]: ([1, 3, 4, 5, 7], 3)

时间复杂度:

O(nlogn) ,是排序的时间的复杂度,

待优化。

归并排序链接

https://blog.csdn.net/qq_33465047/article/details/104148173

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值