Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 对移动到结束列表进行排序_Sorting - Fatal编程技术网

Sorting 对移动到结束列表进行排序

Sorting 对移动到结束列表进行排序,sorting,Sorting,一个顺序唯一的数字列表(1,2,3,…,n)已经随机化,我需要通过每次将一个项目移动到列表的末尾来对其进行排序。哪种算法提供的移动次数最少 注意:[123645]可以用一个移动排序,[125346]在两个移动中,[654321]需要5个移动。我想要一个能解释这些的算法,而不是一个一直给我n-1的算法 我能想到的最好的办法是: for(var x=1; x<=list.length; x++) if indexOf(x+1)<indexOf(x) then move x+1 to en

一个顺序唯一的数字列表(1,2,3,…,n)已经随机化,我需要通过每次将一个项目移动到列表的末尾来对其进行排序。哪种算法提供的移动次数最少

注意:[123645]可以用一个移动排序,[125346]在两个移动中,[654321]需要5个移动。我想要一个能解释这些的算法,而不是一个一直给我n-1的算法

我能想到的最好的办法是:

for(var x=1; x<=list.length; x++)
if indexOf(x+1)<indexOf(x) then move x+1 to end
for(var x=1;x这里有一个算法:

  • 检查列表的长度(从开始到增加),即当列表开始减少时停止
  • 从列表的长度中减去这个长度,这就是你的答案
  • 很直观,想想看。 例如:


    如果列表未按递增顺序排序,则始终可以通过索引对其进行映射。

    以下是我的第二个解决方案:

    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;    
    }
    
    函数mysort(数组){
    风险值指数、价值、价值、,
    len=数组长度;
    //在不好的地方找到值
    坏值=[];
    对于(索引=0;索引0){
    //最小坏值
    value=Math.min.apply(null,badValues);
    index=array.indexOf(值);
    //走到底
    阵列拼接(索引1);
    array.push(值);
    //解决了一个坏问题
    badValues.splice(badValues.indexOf(值),1);
    }
    返回数组;
    }
    
    这是一本书。
    如您所见,输入
    [1,2,9,3,4,8,5,6,7]
    按2步排序,一个完全随机或反向的列表仍然是
    n-1步。

    不管是哪种语言。OP只需要一个算法,可以在最少的步数内完成他想要的。您是否对列表进行了初始排序?如果是,这是一个非常简单的问题,可以在
    n步以内完成。我可以重复用索引重新表示列表中的每个元素,所以是的,假设它最初是按递增顺序排序的。我修改了描述以简化问题。我有点困惑,25341需要4个移动来排序,25341=>53412=>54123=>51234=>12345。如何将列表按3个移动排序?我做了相反的事情。对于正向的事情,map
    2->1,5->2,3->3,4->4,1->5
    。然后你的问题就变成了
    12345->51342
    ,需要四个步骤。@user433342看,它是有效的!!正如我所说,你只能将算法应用于按递增顺序排序的列表。否则,你必须通过索引来映射它。这应该是正确的答案,这是最简单的(我是在一次面试中自己得到的;)intmysort(int[]a{intmax=0;for(inti=0;Ifunction 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; }