这个Javascript代码会导致无限循环吗?

时间:2015-09-26 17:28:50

标签: javascript algorithm optimization

我试图练习我的Javascript印章。出于某些原因,每当我把

function swap ( pair )
{
    temp = pair.first;
    pair.first = pair.second;
    pair.second = temp;
}

function stable_partition ( arr, unpred )
{
    // each x in arr for which upred(x)=true is
    // moved to the right and each for which
    // unpred(x)=false is moved to the left of
    // the array arr

    var i = 0, j = (arr.length - 1);
    while (i < j)
    {
        while ( !unpred(arr[i]) && (i < j) ) ++i;
        while (  unpred(arr[j]) && (i < j) ) --j;
        swap({ first : arr[i], second: arr[j] });
    }
}

var MyUnaryPredicate = function (x) { return x == 0; }
var MyArray = [0, 0, 4, 0, 69, 1932];
stable_partition(MyArray,MyUnaryPredicate); // should move all the zeros to the back of MyArray

for (var k = 0, n = MyArray.length; k < n; ++k) $('#resultdiv').append(MyArray[k] + ' ');

进入JSFiddle谷歌Chrome浏览器使用的CPU,我的电脑听起来好像会爆炸而代码永远不会运行。我的代码有什么问题,还是我的电脑上下铺?

此外,我想知道我是否可以减少程序中的轻微冗余操作

while (i < j)
{
    while ( !unpred(arr[i]) && (i < j) ) ++i;
    while (  unpred(arr[j]) && (i < j) ) --j;
    swap({ first : arr[i], second: arr[j] });
}

因为每次输入循环体时,都会检查i < j两次不相同的时间(因为它已在while条件下检查过。)

2 个答案:

答案 0 :(得分:0)

您可以像这样执行交换功能

function swap(arr, first, second) {
  var temp = arr[first];
  arr[first] = arr[second];
  arr[second] = temp;
}

此外,可以使while循环略短,但不会更快地运行。

while (i < j)
{
    if(!unpred(arr[i])) ++i;
    else if(unpred(arr[j])) --j;
    else swap(arr, i, j);
}

答案 1 :(得分:0)

如果你想要的是让所有元素都满足左边的谓词而所有其他元素都在右边(反之亦然,你只需要调整返回值),我觉得你好多了。用这样的东西:

function stable_partition ( arr, unpred )
{
    var retArray1 = [];
    var retArray2 = [];
    var retArrayIndex1 = 0;
    var retArrayIndex2 = 0;

    for (var i=0; i < arr.length; i++)
    {
        if (!unpred(arr[i]))
        {
            retArray1[retArrayIndex1] = arr[i];
            retArrayIndex1++;
        } else {
            retArray2[retArrayIndex2] = arr[i];
            retArrayIndex2++;
        }
    }

    return retArray1.concat(retArray2);
}