您如何找到将已知列表排序的最小交换集?

时间:2015-10-18 14:35:10

标签: algorithm sorting data-structures language-agnostic

众所周知,对未知列表进行排序的问题不能平均少于N * log(N)步进行。但是找到已知列表的最佳排序问题呢?也就是说,假设您有以下列表:

[1,3,2,7,4]

在这种情况下,只有2个掉期让它排序:

swap 1 2
swap 3 4

远远小于5 * log 5。如何找到将特定列表排序的最小交换集?

注意:此问题与my previous one非常相似,除非没有堆栈计算机。

1 个答案:

答案 0 :(得分:2)

将排列转换为cycle decomposition后,此问题会变得更加轻松。

对于您的示例,使用从零开始的索引的循环分解是(0)(2 1)(4 3)。长度k的每个周期将需要k-1个交换以正确的顺序放置,因此最小交换集的答案是每个周期的(周期长度-1)的总和,并且确定交换的确切集合。识别循环并使用循环中的下一个循环切换循环中的每个元素。

这种方法的复杂性是O(nlogn)找到每个元素的等级加上O(n)来找到循环分解。

这个答案假设您可以交换任意一对元素。

如果只能交换相邻元素来计算数组中的反转次数,请参阅counting inversions