查找对数组进行排序的最小交换次数

时间:2016-08-16 16:49:29

标签: c++ arrays sorting implementation greedy

给定一个包含不同元素的数组,对它进行排序所需的最小交换数是多少?

例如,数组[4, 2, 1, 3]至少需要2次交换(例如,交换4和1,然后是4和3)。

这是我的方法:

B = sort(copy(A))
for i = 0 ... len(A) - 1
    if A[i] != B[i]
        find j such that A[j] == B[i]
        swap(A[i], A[j])

我的方法是否正确?还有另一种解决方法吗?

1 个答案:

答案 0 :(得分:4)

这取决于您是否尝试查找最小数量的交换,或者实际尝试对数组进行排序。

如果您正在尝试对数组进行排序,那么最小数量的交换将无法帮助您更快地对其进行排序。找到最佳排序算法将帮助您更快地排序。通常,这意味着找到一个具有O(n log(n))复杂度的(除非数组很小或内存是主要约束)。有关此问题的帮助,Google就是您的朋友。

如果您只是想找到所需的最小交换次数,而不实际对其进行排序,那么您正在查看对选择排序的一些修改。一个人去的方式是找到最低值,与第一个索引交换,找到第二个最低值,与第二个索引交换等等。

但正如我所说,找到最小量的掉期并不能优化排序。例如,选择排序可能具有比快速排序更少的交换,但是选择排序需要更长的时间来确定要交换的哪些空格。选择排序的时间复杂度为O(n ^ 2)。

顺便说一句,O(n ^ 2)和O(n log(n))之间的差异并不像它看起来那么微不足道。如果数字大约为1,000,000,则可能是20,000,000和1,000,000,000,000之间的差异。