查找最小转换次数

时间:2014-08-20 04:12:22

标签: arrays algorithm sorting

有许多与排序数字数组相关的算法,但我只是想知道是否有算法计算最小数量的转换来排序数字数组。

例如,如果给定的整数数组是

 a[5]={20, 15, 40, 30, 60}

然后按升序对数组进行排序所需的最小转换次数为2,因为我们需要做的是将[0]切换为[1],将[2]切换为[3]。

1 个答案:

答案 0 :(得分:2)

最小转换次数:

我们可以使用序列的反转数来衡量其排序。

在您的示例中,[20, 15, 40, 30, 60]有两次反转:

(20, 15), (40, 30)

  

注意

     

如果我< j和A(i)> A(j),然后该对(i,j)被称为A

的反转

所以我们需要进行两次转换。

序列的反转数是最小转换次数以对序列进行排序。

如何获取分散号:

您可以使用standard comparison sorting algorithms及时计算反转数O(n log n)Merge sort通常用于计算反转数。

示例代码(python2):

# -*- coding: utf-8

def merge(a1, n1, a2, n2, a, n):
    c = c1 = c2 =0
    count = 0
    while c < n:
        if c1 == n1:
            while c < n:
                a[c] = a2[c2]
                c = c + 1
                c2 = c2 + 1
        elif c2 == n2:
            while c < n:
                a[c] = a1[c1]
                c = c + 1
                c1 = c1 + 1
        else:
            if a1[c1] > a2[c2]:
                a[c] = a2[c2]
                count = count + n1 - c1
                c = c + 1
                c2 = c2 + 1
            else:
                a[c] = a1[c1]
                c = c + 1
                c1 = c1 + 1
    return count

def Sort(a):
    n = len(a)
    if n == 1: return 0
    n1 = n/2
    n2 = n - n1
    a1 = a[:n1]
    a2 = a[n1:]
    count1 = Sort(a1)
    count2 = Sort(a2)
    c = c1 = c2 = 0
    count = count1 + count2 + merge(a1, n1, a2, n2, a, n)
    return count

array = [8, 2, 3, 1, 6, 5, 9]
print array, 'has %d inversions.' % Sort(array)
array = [20, 15, 40, 30, 60]
print array, 'has %d inversions.' % Sort(array)

实际上,排序过程只是删除所有反转。所以你可以用它来计算反演数。

有关详细信息,请查看wiki:)。