我正在尝试对数组元素进行排序。我做了一个非常简单的算法。就这个
<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循环增加它。但它变得无限。相同的算法在另一个程序中正常工作。但这里没有。感谢您的帮助。
答案 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是数组的最后一个索引值。
我希望有所帮助。 (并且有道理:))