元素上的气泡排序

Bubble sort on elements

本文关键字:排序 气泡 元素      更新时间:2023-09-26

我有一个表,其中包含某些事物的理论速率(id=ratebaseX)和实际观察到的速率(id=rate seenX)。我有一个javascript,它运行在每对中,并简单地计算差异(id=calcX)。

在计算出这个差异之后,我想根据这个计算出的差异对calcIDs数组进行冒泡排序。实际上,我不想更改calcID类中的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);
}

问题是,前三个元素不移动。我确信我的气泡排序是正确的。我认为问题是calcID实际上是一个指针数组?

您的气泡排序正常,我检查过了:

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没有返回数组。它返回一个类型为NodeList的对象,而在JS中通常只能对真正的数组进行排序。我的意思是,您可以将排序算法应用于集合,但"排序"的项目将以与排序前相同的预定义顺序显示。一个简单的解决方法可能是将节点集合转换为一个实际的数组,如下所示:

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

然后你就可以应用排序并得到你想要的结果。这对你的目的来说是可以的,因为你声明你不想改变视图。我希望这个迟来的答案能有所帮助:)