Sorting 对移动到结束列表进行排序
一个顺序唯一的数字列表(1,2,3,…,n)已经随机化,我需要通过每次将一个项目移动到列表的末尾来对其进行排序。哪种算法提供的移动次数最少 注意:[123645]可以用一个移动排序,[125346]在两个移动中,[654321]需要5个移动。我想要一个能解释这些的算法,而不是一个一直给我n-1的算法 我能想到的最好的办法是: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
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个移动排序?我做了相反的事情。对于正向的事情,map2->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;
}