假设我有一个这样的数组: [5 4 1 2 3]
我想计算对未排序的排列进行排序所需的最小开关。
在这种情况下,现在答案是 7。只需向右移动 4 和 5,或向左移动 1、2、3。
但具有讽刺意味的是,我在笔记中使用了 [4 5 1 2 3],它给出了 6,并误导了自己并自欺欺人。
脚步:
[5 1 4 2 3] // 步骤 1
[1 5 4 2 3] // 步骤 2
[1 5 2 4 3] // 步骤 3
[1 2 5 4 3] // 步骤 4
[1 2 5 3 4] // 步骤 5
[1 2 3 5 4] // 步骤 6
[1 2 3 4 5] // 步骤 7
我已经想到了诸如拥有一个保持所需偏移量的数组之类的事情,并且对于每个循环,只需寻找使整个事物更接近目标的开关。
但这似乎太慢了,有什么想法吗?
编辑:来自评论:数组的成员是否保证完全属于为大小为 N 的数组设置的 {1..N},而不重复数字?
没有。对于大小为 N 的数组,不能保证不重复或不在 [1...n] 中。
更新:
这个特定问题有两种解决方案,一种是较慢但更直接的冒泡排序,另一种是更快但不太直接的归并排序。
使用冒泡排序,您基本上可以在运行算法时计算开关的数量。
使用mergesort,它有点棘手,但合并时会发生计数。当数组已经合并时,计数应为 0,因为不需要任何开关来对该数组进行排序。使用冒泡排序,您可以在向左或向右推动最大或最小数字时计算开关。使用合并排序,您可以在合并时计算开关。我有点手写蛮力会让你到达那里。