泡沫排序元素

时间:2016-01-08 16:07:09

标签: javascript arrays sorting bubble-sort

我有一个表格,其中包含某事物的理论速率(id = ratebaseX)和某事物的实际观察率(id = rateseenX)。我有一个javascript贯穿每一对,简单计算差异(id = calcX)。

计算出这个差异后,我想根据计算出的差异对calcIDs数组进行冒泡排序。我实际上并不想更改calcIDs类中的html或任何东西,只是更改数组中的索引。

对于测试,我将前三个数组元素转储到一个警告框中,因为我知道它们最初是乱序的。

function calcLikelihood(){
    ratebaseIDs = document.querySelectorAll('[id^="ratebase"]');
    rateseenIDs = document.querySelectorAll('[id^="rateseen"]');
    calcIDs = document.querySelectorAll('[id^="calc"]');

    for(i=0;i<calcIDs.length;i++){
        likelihood = Math.round((ratebaseIDs[i].innerHTML - rateseenIDs[i].innerHTML)*100)/100;
        calcIDs[i].innerHTML = likelihood;
        calcIDs[i].likelihood = likelihood;
    }
    //bubble sort based on likelihood
    for(i=0;i<calcIDs.length;i++){
        for(j=0;j<(calcIDs.length-1);j++){
            if(calcIDs[j].likelihood<calcIDs[j+1].likelihood){
                temp = calcIDs[j];
                calcIDs[j] = calcIDs[j+1];
                calcIDs[j+1] = temp;
            }
        }
    }
    alert("0) " + calcIDs[0].likelihood +"\n1) " + calcIDs[1].likelihood+"\n2) " + calcIDs[2].likelihood);
}

问题在于前三个元素不会移动。我很确定我的泡泡排序是正确的。我认为问题是calcIDs实际上是一个指针数组?

1 个答案:

答案 0 :(得分:0)

你的冒泡排序还可以,我查了一下:

var calcIDs = [{likelihood: 84}, {likelihood: 56}, {likelihood: 68}, {likelihood: 81}];    
    //bubble sort based on likelihood
    for(i=0;i<calcIDs.length;i++){
        for(j=0;j<(calcIDs.length-1);j++){
            if(calcIDs[j].likelihood<calcIDs[j+1].likelihood){
                temp = calcIDs[j];
                calcIDs[j] = calcIDs[j+1];
                calcIDs[j+1] = temp;
            }
        }
    }

console.log("0) " + calcIDs[0].likelihood +"\n1) " + calcIDs[1].likelihood+"\n2) " + calcIDs[2].likelihood); 
// 84, 81, 68

所以,我认为问题是document.querySelectorAll没有返回数组。它返回type NodeList的对象,而您通常只能在JS中对真正的数组进行排序。我的意思是您可以将排序算法应用于集合,但“排序”项目将按照排序前显示的相同预定义顺序显示。一个简单的解决方法可能是将节点集合转换为实际数组,如下所示:

var arr = Array.prototype.slice.call(nodes); // nodes = document.querySelectorAll(".your_selector");

然后您就可以应用排序并获得您的期望。它可以用于您的目的,因为您声明您不想更改视图。我希望这个迟到的答案有助于:)