使用简单算法对数组进行排序,但循环变为无限

时间:2015-07-16 04:36:16

标签: javascript

我正在尝试对数组元素进行排序。我做了一个非常简单的算法。就这个

<html>
<head>  

    <script>

    var numberList = [44, 58, 12, 53, 25, 63];  

    for(var i = 0; i<numberList.length; i++){
        var reset = i;
        for(var j = 1; j<numberList.length; j++){
            if(numberList[j]<numberList[i]){
                var k = numberList[i];
                var l = numberList[j];
                numberList[i] = l;
                numberList[j] = k;
                i++;
            } else{
                var k = numberList[i];
                var l = numberList[j];
                numberList[i] = k;
                numberList[j] = l;
                i++;
            }                   
        }   
        i = reset;      
    } 
    document.write(numberList); 

    </script>

</head>

<body>

</body>
</html> 

但问题是循环变得无限。每次执行内部for循环后,变量i的值变为5.所以我引入了一个名为reset的变量来恢复i的值。所以我再次设定它的主要价值&amp;然后首先for循环增加它。但它变得无限。相同的算法在另一个程序中正常工作。但这里没有。感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

当你在“j”-cycle的范围内增加i时,你不会检查我是否小于数组长度。即在执行此循环期间,您将引用不存在的数组元素并将其添加到数组中。所以你需要在第二个语句中改变条件:

for(var i = 0; i<numberList.length; i++){
    var reset = i;
    for(var j = 1; j<numberList.length &&  i<numberList.length; j++){

因此,如果我们逐步完成您的代码,我们可以找到下一个:

i = 0, j = 1: [44, 58, 12, 53, 25, 63]
i = 1, j = 2: [44, 12, 58, 53, 25, 63]
i = 2, j = 3: [44, 12, 53, 58, 25, 63]
i = 3, j = 4: [44, 12, 53, 25, 58, 63]
i = 4, j = 5: [44, 12, 53, 25, 58, 63]

i = 1, j = 1: [44, 12, 53, 25, 58, 63]
i = 2, j = 2: [44, 12, 53, 25, 58, 63]
i = 3, j = 3: [44, 12, 53, 25, 58, 63]
i = 4, j = 4: [44, 12, 53, 25, 58, 63]
i = 5, j = 5: [44, 12, 53, 25, 58, 63]

i = 2, j = 1: [44, 53, 12, 25, 58, 63]
i = 3, j = 2: [44, 53, 25, 12, 58, 63]
i = 4, j = 3: [44, 53, 25, 58, 12, 63]
i = 5, j = 4: [44, 53, 25, 58, 63, 12]
i = 6, j = 5: // i == numberList.length

这就是你的无限循环的原因

答案 1 :(得分:2)

尝试这个

var numberList = [44, 58, 12, 53, 25, 63];  
    var intArrayLength = numberList.length;
    for(var i = 0; i <intArrayLength; i++){

        for(var j = i+1; j < intArrayLength; j++){

            if(numberList[i] > numberList[j] ){
                var swapNumber = numberList[j];
                numberList[j] = numberList[i];
                numberList[i] = swapNumber;
            }                  
        }   

    } 
    document.write(numberList); 

编辑:

内部for循环也可以这种方式编写而不使用临时变量。

for(var j = i+1; j < intArrayLength; j++){

            if(numberList[i] > numberList[j] ){
                numberList[j] += numberList[i];
                numberList[i] =  numberList[j]-numberList[i];
                numberList[j] =  numberList[j]-numberList[i];
            }                  
        }

答案 2 :(得分:2)

for(var i = 0; i<numberList.length-1; i++){ 
   for(var j = i+1; j<numberList.length; j++){
        if(numberList[j]<numberList[i]){
            var k = numberList[i];
            var l = numberList[j];
            numberList[i] = l;
            numberList[j] = k;
        }                   
    }     
} 

答案 3 :(得分:0)

每次i递增时,reset的值就会设置为新的i值。

当你有一行i = reset;时,它没有任何区别,因为在顶部你已经告诉它reset = i。尝试取出重置变量。

此外,.length命令将返回数组中的值数。在这种情况下length = 6。但是,数组的最终索引实际上是数字5,因为它从0开始(0,1,2,3,4,5 = 6个索引)。因此,当i为5时,它仍然小于长度,因此您编写的代码将i增加到6,这超出了数组的范围。
要解决此问题,您可以将代码更改为读取...

for(var i = 0; i< (numberList.length-1); i++)

这样当i为5时,它不会再增加,因为5是数组的最后一个索引值。

我希望有所帮助。 (并且有道理:))