最小转换次数:
我们可以使用序列的反转数来衡量它的排序性。
在您的示例中,[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 :)。