如何减少数组中的移动操作数?

时间:2019-04-19 09:46:03

标签: arrays algorithm sorting

说我有一个数字数组,例如[0, 1, 2, 3, 4, 5],我想以一个数组结尾,例如[2, 1, 4, 0, 5, 3]。我有一种方法可以使用:

move(fromIndex, toIndex)

因此,要获得所需的数组,我可以多次调用该方法:

move(2, 0); // [2, 0, 1, 3, 4, 5]
move(1, 2); // [2, 1, 0, 3, 4, 5] (swapped 2 with 0)

move(4, 2); // [2, 1, 4, 0, 3, 5]
move(3, 4); // [2, 1, 4, 3, 0, 5] (swapped 4 with 0)

move(4, 3); // [2, 1, 4, 0, 3, 5] (swapped 0 with 3)

move(5, 4); // [2, 1, 4, 0, 5, 3] (swapped 5 with 3)

因此,我还列出了move()个操作,以实现所需的结果。通过更改顺序和索引,可以减小move()操作列表的大小,以得到相同的结果。

我可以在move()操作列表中使用一种算法来将操作数量减少到最少吗?

1 个答案:

答案 0 :(得分:0)

我们可以创建一个图形,该图形的元素指向需要交换以达到所需位置的数字。因此,我们将获得具有可能周期的多个图。在您的特定情况下,我们会得到

  

2-> 0-> 3-> 5-> 4-> 2(第一个和最后一个元素表示一个循环)

     

这意味着2想要与0交换以获得所需的位置。同样,0要与3互换才能到达所需位置。请注意,1不想被交换。

现在,我们可以交换图形的两个相邻元素,以将图形大小减小1。假设交换3和5,那么现在arr = [0,1,2,5,4,3]。现在3处于所需状态,因此我们可以将其从图形中删除

  

2-> 0-> 5-> 4-> 2

我们需要重复此过程(m-1)次才能完全删除图形。在此,m表示图形的边数。我们可以有多个断开连接的图或没有循环的图。我们需要确保要交换同一图中的元素。最终答案将是图的所有步骤的总和(每个组件的m-1)。