有许多与排序数字数组相关的算法,但我只是想知道是否有算法计算最小数量的转换来排序数字数组。
例如,如果给定的整数数组是
a[5]={20, 15, 40, 30, 60}
然后按升序对数组进行排序所需的最小转换次数为2,因为我们需要做的是将[0]切换为[1],将[2]切换为[3]。
答案 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:)。