题目
如果一个数组已经排好序,当是升序的时候,那么逆序对个数为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