【问题标题】:Finding the minimum number of transitions找到最小的转换次数
【发布时间】:2014-10-13 07:58:29
【问题描述】:

有很多与排序数字数组相关的算法,但我只是想知道是否有一种算法可以计算最小转换次数来对数字数组进行排序。

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

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

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

【问题讨论】:

  • 与实际对数据进行排序相比,找出需要多少次转换可能需要更长的时间。 :)

标签: arrays algorithm sorting


【解决方案1】:

最小转换次数:

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

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

(20, 15), (40, 30)

注意

如果 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 :)。

【讨论】:

    猜你喜欢
    • 2017-12-20
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多