众所周知,对未知列表进行排序的问题不能平均少于N * log(N)
步进行。但是找到已知列表的最佳排序问题呢?也就是说,假设您有以下列表:
[1,3,2,7,4]
在这种情况下,只有2个掉期让它排序:
swap 1 2
swap 3 4
远远小于5 * log 5
。如何找到将特定列表排序的最小交换集?
注意:此问题与my previous one非常相似,除非没有堆栈计算机。
答案 0 :(得分:2)
将排列转换为cycle decomposition后,此问题会变得更加轻松。
对于您的示例,使用从零开始的索引的循环分解是(0)(2 1)(4 3)。长度k的每个周期将需要k-1个交换以正确的顺序放置,因此最小交换集的答案是每个周期的(周期长度-1)的总和,并且确定交换的确切集合。识别循环并使用循环中的下一个循环切换循环中的每个元素。
这种方法的复杂性是O(nlogn)找到每个元素的等级加上O(n)来找到循环分解。
这个答案假设您可以交换任意一对元素。
如果只能交换相邻元素来计算数组中的反转次数,请参阅counting inversions。