题目
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。
输入格式
第一行包含整数 n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。
输出格式
输出一个整数,表示逆序对的个数。
数据范围
1≤n≤100000
数列中的元素的取值范围 [1,109]。
输入样例:
6
2 3 4 5 6 1
输出样例:
5
我的求解
n = int(input())
ls = [0] * 100000
ls[0:n] = list(map(int, input().split(" ")))
cnt = 0
for i in range(n):
for j in range(n):
if i < j and ls[i] > ls[j]:
cnt = cnt + 1
print(cnt)
思路
递归算法求解
ls = [0] * 100000
temp = [0] * 100000
global ans
def Merge_sort(ls, l, r):
if l >= r:
return
mid = (l + r) // 2
Merge_sort(ls, l, mid)
Merge_sort(ls, mid + 1, r)
global ans
i = l
j = mid + 1
k = 0
while i <= mid and j <= r :
if ls[i]<=ls[j]:
temp[k] = ls[i]
i = i + 1
k = k + 1
else:
temp[k] = ls[j]
j = j + 1
k = k + 1
ans = ans + mid-i
//在下标i之前的数组都是从小到大排好序的。当指针指向i时,left数据块中的数据出现了比right数据块中
//的数据大的数字,则在left数据块中下标i及下标i往右的数据相对于right数据块中的数据都是逆序对
while i <= mid:
temp[k] = ls[i]
i = i + 1
k = k + 1
while j <= r:
temp[k] = ls[j]
j = j + 1
k = k + 1
k = 0
for i in range(l,r+1):
ls[i] = temp[k]
k = k+1
if __name__ == '__main__':
ans = 0
n = int(input())
ls[0:n] = list(map(int, input().split(" ")))
Merge_sort(ls, 0, n - 1)
print(ans)