一个连续的唯一数字列表(1,2,3,...,n)已被随机化,我需要通过一次将一个项目移动到列表末尾来对其进行排序。哪种算法可以提供最少的移动次数?
注意:[123645]可以进行1次移动,[125346]进行2次移动,[654321]需要5次移动。我想要一个可以解释这些的算法,而不是一直给我n-1的算法。
我能想到的最好:
for(var x=1; x<=list.length; x++)
if indexOf(x+1)<indexOf(x) then move x+1 to end
这有用吗?最佳解决方案?
答案 0 :(得分:1)
这是一个算法:
非常直观,只需考虑一下。 例如:
12345 -> 25341
|25| is in increasing order and after that it becomes decreasing.
Length (2,5) = 2
Answer = 5 - 2 = 3
如果您的列表没有按递增顺序排序,您可以始终通过索引进行映射。
答案 1 :(得分:0)
这是我的第二个解决方案:
function mysort(array) {
var index, value, badValues,
len = array.length;
// find values at a bad place
badValues = [];
for (index = 0; index < len; index++) {
if (array[index] !== index + 1 - badValues.length) {
badValues.push(array[index]);
}
}
// move those to the end in increasing order
while (badValues.length > 0) {
// minimum bad value
value = Math.min.apply(null, badValues);
index = array.indexOf(value);
// move to the end
array.splice(index, 1);
array.push(value);
// one bad solved
badValues.splice(badValues.indexOf(value), 1);
}
return array;
}
这是demo fiddle。
如您所见,输入[1,2,9,3,4,8,5,6,7]
按2次移动排序,完全随机或反向列表仍然n-1
移动。