将移动排序到结束列表

时间:2014-02-16 10:31:38

标签: sorting

一个连续的唯一数字列表(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

这有用吗?最佳解决方案?

2 个答案:

答案 0 :(得分:1)

这是一个算法:

  1. 检查列表的长度(从头开始),直到它增加,即在列表开始减少时停止。
  2. 从列表长度中减去该长度。这就是你的答案。
  3. 非常直观,只需考虑一下。 例如:

    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移动。