当前位置 : 主页 > 手机开发 > 无线 >

数组 – 以最小移动次数对数组进行排序

来源:互联网 收集:自由互联 发布时间:2021-06-10
理论上可以对数组进行长度(数组)排序 – 长度(longestIncreasingSubsequence(array))通过仅移动尚未按排序顺序排列的元素来移动. 如果允许的唯一操作是就地移动,通过从索引A中删除一个元素并
理论上可以对数组进行长度(数组)排序 – 长度(longestIncreasingSubsequence(array))通过仅移动尚未按排序顺序排列的元素来移动.

如果允许的唯一操作是就地移动,通过从索引A中删除一个元素并将其重新插入索引B,一次一个元素,您将如何生成正确的移动以结束排序的数组?同样,应该有长度(数组) – 长度(longestIncreasingSubsequence(array))移动所需.

例如,这是一个数组:

[ 1, 8, 5, 2, 4, 6, 3, 9, 7, 10 ]

增长最快的子序列是:

[ 1, 2, 4, 6, 7, 10 ]

这些要素的指数是:

[ 0, 3, 4, 5, 8, 9 ]

因此,我们需要移动的指数是:

[ 1, 2, 6, 7]

因为那些是尚未排序的索引.

为了得到排序数组,这4个元素的最终索引是:

[ 7, 4, 2, 8]

因此,我们需要同时将索引1移动到索引7,将索引2移动到索引4,将索引6移动到索引2,将索引7移动到索引8.问题是当移动元素时,其他元素会移动到后来的移动操作无效.我已经尝试过转换这些索引,但到目前为止还没有提出正确的移动列表.有任何想法吗?

希望我已经很好地解释了这个问题.请提问,我会澄清.谢谢!

您的问题是源位置以先前的顺序表示,而目标位置是最终的顺序.当您执行1-> 7时,您还不知道先前顺序中的7.您需要对所有动作进行调整.

最初的举动是:

from: [ 1, 2, 6, 7]
to:   [ 7, 4, 2, 8]

步骤1

让我们首先转换位置,好像我们首先删除所有元素,然后将元素插入新位置.对于从位置,从左侧开始:在1档位(2,6,7)向下移动到(1,5,6).在1处移除再次将(5,6)向下移动到(4,5).在5档移动时将5向下移动到4.对于具有更大或相等索引的所有后续位置中的每个位置必须递减.我们得到:

from: [ 1, 1, 4, 4]

对于到位,从头到尾:位置8是正确的.位置2也是正确的,但这意味着先前(7,4)在插入时实际上是(6,3).所以我们调整它们.类似地,插入3表示先前位置6为5.

因此,对于to数组,我们从最后开始,对于每个位置,我们递减所有具有较大索引的先前位置. to数组变为:

to:   [ 5, 3, 2, 8]

第2步

我们所拥有的是4次移除的正确位置,然后是4次插入.现在我们想要删除删除和插入.

必须在(1,1,4)的删除之前进行5的插入. 5大于这些中的任何一个,因此它不会影响位置(1,1,4),但是5会受到影响,因为在插入点的左侧进行了3次移除. 5变为8.

必须在(4,4)处的移除之前插入3.由于3小于4,因此位置3不受移除影响,但移除必须增加到位置(5,5).

插入2是在最后一次移除5之前(是4).它更小,因此5调整为6.

第2步的一般方法:

for i = 0 to size-1
    for j = size-1 to i+1
        if from[j] < to[i] then increment to[i]
        else increment from[j]

我们应该得到数组:

from: [ 1, 1, 5, 6]
to:   [ 8, 3, 2, 8]

这些是在移动时使用正确位置执行的最终动作.移动可以从左到右读取:从1处移除,在8处插入.在1处移除,在3处插入3.在5处移除,在2处插入2.在6处移除,在8处插入.

网友评论