Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并排序的计数反转_Python_Algorithm_Mergesort - Fatal编程技术网

Python 合并排序的计数反转

Python 合并排序的计数反转,python,algorithm,mergesort,Python,Algorithm,Mergesort,我已经实现了一个正确工作的mergesort函数,但是,在排序之前,我很难修改它来计算原始数组中的反转数 反转是一对,其中ia[j]例如,a=[5,2,1]有3个反转:(5,2)、(5,1)、(2,1) def合并排序(a): mid=len(a)//2 如果len(a)

我已经实现了一个正确工作的mergesort函数,但是,在排序之前,我很难修改它来计算原始数组中的反转数

反转是一对,其中
ia[j]
例如,
a=[5,2,1]
有3个反转:
(5,2)、(5,1)、(2,1)

def合并排序(a):
mid=len(a)//2
如果len(a)<2:
返回
l=a[:中间]
r=a[mid:]
合并排序(l)
合并排序(r)
返回合并(l、r、a)
def合并(左、右、a):
i=0
j=0
k=0
inv=0
而(i
上面的例子应该返回15作为反转计数,因为n(n-1)/2是降序数组的反转数


有人能解释一下如何计数吗?

L[i]>R[j]
是一个单一的反转,但请注意,由于数组是经过排序的,如果
L[k]>R[j]
对于某些
k
,这意味着对于所有i,都有一个代码用于post中的相同问题。
def mergeSort(a):

    mid = len(a)//2

    if len(a) < 2:
        return

    l = a[:mid]
    r = a[mid:]
    mergeSort(l)
    mergeSort(r)

    return merge(l,r,a)

def merge(l,r,a):
    i = 0
    j = 0
    k = 0

    inv = 0

    while(i < len(l) and j < len(r)):
        if(l[i] < r[j]):
           a[k] = l[i]
           i = i + 1
        else:
            a[k] = r[j]
            inv = inv + 1
            j = j + 1
        k = k + 1

    while i < len(l):
        a[k] = l[i]
        i = i + 1
        k = k + 1
    while j < len(r):
       a[k] = r[j]
       j = j + 1
       k = k + 1
       inv = inv + 1
    return [a,inv]

a = [6,5,4,3,2,1]
print(mergeSort(a))