计算mergesort的倒置

时间:2017-12-03 23:38:16

标签: python algorithm mergesort

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

反转是一对i < j but a[i] > a[j]示例,a = [5,2,1]有3个反转:(5,2),(5,1),(2,1)

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))

上面的例子应该返回15作为反转计数,因为n(n-1)/ 2是降序数组的反转次数。

有人可以解释如何计算吗?

1 个答案:

答案 0 :(得分:1)

L[i] > R[j]是单个反转,但请注意,由于数组已排序,如果某些L[k] > R[j]k,则表示L[k] > R[j] for all i <= k < |L|。因此,您可以从L中减去数组i的长度,以便为您提供反转的总数。