计算数组中反转的次数(python代码)



所以我正在阅读这段代码,它正在浏览一个包含10000个随机顺序(无重复(整数的文件,并计算反转次数。我还没有完全理解这段代码,我有几个问题:首先,我想这是将数组分为左右两部分,直到长度为1。当左数组和右数组的长度都为1时,我们在这里做什么和计数?(我可能完全误解了这个代码,请纠正我(。而";"中段";元素每次都会消失吗?从我每次看到的情况来看,这个元素既不属于右数组,也不属于左数组。最后一个问题是;count+=(len(a(-i(";只有当左数组和右数组都已经排序(排序(时才是正确的,但我看不出这个排序过程在哪里。这是代码:

from pathlib import Path
file_path = Path("c:/Users/Lyra/Desktop/Algorithm/")
inFile = open(file_path / "IntegerArray.txt", 'r')
with inFile as f:
numList = [int(integers.strip()) for integers in f.readlines()]

count = 0
def inversionsCount(x):
global count
midsection = len(x) // 2
leftArray = x[:midsection]
rightArray = x[midsection:]
if len(x) > 1:
# Divid and conquer with recursive calls
# to left and right arrays similar to
# merge sort algorithm
inversionsCount(leftArray)
inversionsCount(rightArray)

# Merge sorted sub-arrays and keep
# count of split inversions
i, j = 0, 0
a = leftArray; b = rightArray
for k in range(len(a) + len(b) + 1):
if a[i] <= b[j]:
x[k] = a[i]
i += 1
if i == len(a) and j != len(b):
while j != len(b):
k +=1
x[k] = b[j]
j += 1
break
elif a[i] > b[j]:
x[k] = b[j]
count += (len(a) - i)
j += 1
if j == len(b) and i != len(a):
while i != len(a):
k+= 1
x[k] = a[i]
i += 1                    
break   
return x
# call function and output number of inversions
inversionsCount(numList)
print (count)

我知道我问了很多问题,但我现在真的很困惑,提前谢谢!

没有"中段";要素midsection只是x中间的索引leftArray=x[:midsection]和rightArray=x[midsection:]将一起复制x中的所有元素,如果长度为奇数,则中间的元素将终止于rightArray中。

排序是由函数本身通过更改传递的参数x中的元素来进行的。列表是可变的,并作为引用传递给函数。因此,每个x[n] = something都会影响传递的列表参数,因此也会影响调用范围中的相应变量。这意味着inversionsCount(leftArray)leftArray排序之后。

如果您运行一个较小的列表,如inversionsCount([6,0,3,1,2,5,4]),并在代码中放入一些print(interesting_varable)。然后你可能会发现发生了什么。

最新更新