2016-08-14 32 views
0

我基本上是试图通过将数字到正确的位置进行排序号在飞行中的输入(不是100%肯定,但是这应该是插入排序)。我的理解是,要在javascript中插入数组,您需要使用数组拼接方法http://www.w3schools.com/jsref/jsref_splice.aspJavaScript数组拼接导致内存不足异常?

我实现我的目标的企图代码如下:

var N = parseInt(readline()); 
var powers = [0]; 
for (var i = 0; i < N; i++) { 
    var pi = parseInt(readline()); 
    for(var j=i;j<powers.length; j++){ 
     if(powers[j]>pi){ 
      powers.splice(j,0,pi); 
     } 
     else if(j+1==powers.length){ 
      powers[j+1]=pi; 
     } 
    } 
} 

当我运行这段代码,我得到一个内存不足的异常。我只是想了解是我在上面的代码中做错了什么。如果我使用拼接方法错误,并且它是内存泄漏的原因,那么底层实际发生了什么? 我知道还有其他的方法可以做这种排序,但我特别感兴趣的是使用javascript数组进行插入排序。

+0

开始无论你使用的环境,肯定有很多可用了一个调试器。例如,所有主要的Web浏览器都内置了全功能的调试器.NodeJS有几个可用的,其中之一是'node-inspector'。我建议中断你正在做的事情,并学习如何使用该调试器逐个声明代码,这样你就可以看到代码是如何运行的。没有什么更多的信息可以确切地看你的代码如何运行。 –

回答

3

在你else条件下,要添加到阵列中,使得它一里。这意味着在下次检查powers.length循环,这将是一个较大的数字,这意味着你将再次进入循环体,这意味着你将再次添加到阵列中,这意味着你将重新回到循环体再次,这意味着......你看到了这个去向。 :-)

一旦你添加到数组(不管是哪个分支),退出循环(例如,与break)。


端注:如果您在i开始j因为你是你目前不会做一个适当的插入排序。 i只是计算用户表示他们将要输入的条目数量,而不是这种排序的一部分。考虑:如果我输入8和4,该怎么办?如果您从开始i,您将跳过8并将4放在错误的地方。 j需要在0

+1

另外'如果'情况下使阵列更长。所以它在每次迭代中都会发生。 – trincot

+0

@trincot:好一点,这样做,只是至少在这种情况下,我们将继续前进,因为'权力[J]> pi'不会是真的了。不过,好点。 –

+0

谢谢。我忘了休息时间。基本的错误在我身边。 – IgnitiousNites