【问题标题】:Bubble sort on elements对元素进行冒泡排序
【发布时间】:2016-04-13 09:16:32
【问题描述】:

我有一个表格,其中包含某事物的理论速率 (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 实际上是一个指针数组?

【问题讨论】:

  • 要移动 HTML 元素本身,您必须删除它们,然后按正确的顺序追加它们。
  • 除非这是针对您特别需要实现冒泡排序的任务,否则我想不出更糟糕的算法选择。如果你只是想对数组进行排序,最好的选择是使用 Array 类的 sort() 方法。
  • @MattBurland - remove them and then append them - 附加它们会将它们从原始位置删除,因此,这并不完全正确:D
  • 不仅正如@JonTrauntvein 所说,还有更好的方法来对数组进行排序而不是自己实现冒泡排序(并且可能会出错),还有可用的 javascript 库可以创建可排序的表你。
  • @Neofish:w3schools 很少是一个好的链接。 MDN 链接通常要好得多。

标签: javascript arrays sorting bubble-sort


【解决方案1】:

你的冒泡排序没问题,我检查过了:

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");

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2019-05-10
    • 2017-09-27
    相关资源
    最近更新 更多