在JavaScript中的两元素数组数组上实现MergeSort

在JavaScript中的两元素数组数组上实现MergeSort,javascript,arrays,sorting,Javascript,Arrays,Sorting,我正在尝试使用合并排序对边集数组进行排序,这些边集本身表示为2元素数组,即边EC是['e','C'] 我试图排序的数组是['D','F'],['A','D'],['F','I'],['B','E'],['B','J'],['A','C'],['E','G'],['A','J'],['G','H']。我希望它首先按“from”边排序,然后如果两条边具有相同的“from”边,则按“to”(第二条)边排序 当我在Firebug中运行以下程序时,看起来它正在工作(从我打印到控制台的内容),但最后它给出了

我正在尝试使用合并排序对边集数组进行排序,这些边集本身表示为2元素数组,即边EC是
['e','C']

我试图排序的数组是
['D','F'],['A','D'],['F','I'],['B','E'],['B','J'],['A','C'],['E','G'],['A','J'],['G','H']
。我希望它首先按“from”边排序,然后如果两条边具有相同的“from”边,则按“to”(第二条)边排序

当我在Firebug中运行以下程序时,看起来它正在工作(从我打印到控制台的内容),但最后它给出了
['AC','AC','AC','AC','AC',…]

Array.prototype.toString = function(){
  var s = "[";
  if(this.length > 0){
    s += this[0].toString();
    for(var i = 1; i < this.length; i++){
      s += ", " + this[i].toString();
    }
  }
  s += "]";
  return s;
}

var edges = [['D', 'F'], ['A', 'D'], ['F', 'I'], ['B', 'E'], ['B', 'J'],
             ['A', 'C'], ['E', 'G'], ['A', 'J'], ['G', 'H']];

function sortEdges(edges){
  // mergesort
  // split up
  if(edges.length < 2){
    return edges;
  } else {
    var fH = edges.slice(0, Math.floor(edges.length / 2)); // fH: firstHalf
    var sH = edges.slice(Math.floor(edges.length / 2), edges.length); // sH: firstHalf

    console.log(fH.toString());
    console.log(sH.toString());

    fH = sortEdges(fH);
    sH = sortEdges(sH);

    // merge
    var fHC = 0; // fHC: firstHalfCounter
    var sHC = 0; // sHC: secondHalfCounter

    var bothHalves = new Array();
    for(var i = 0; i < edges.length; i++){
      console.log("fHC: " + fHC + ", sHC: " + sHC + ", bothHalves: " + bothHalves.toString());
      if(fHC < fH.length && (sHC >= sH.length || fH[fHC][0] < sH[sHC][0])){ 
        // compare 'from' vertex
        bothHalves.push(fH[fHC]);
        fHC++;
      } else if(fHC < fH.length && fH[fHC][0] == sH[sHC][0]){ 
        // if tied, compare 'to' vertex
        if(fH[fHC][1] <= sH[sHC][1]){
          bothHalves.push(fH[fHC]);
          fHC++;
        } else {
          bothHalves.push(sH[sHC]);
          sHC;
        }
      } else {
        bothHalves.push(sH[sHC]);
        sHC++;
      }
    }
    return bothHalves;
  }
}
edges = sortEdges(edges);
console.log(edges.toString());
Array.prototype.toString=function(){
var s=“[”;
如果(此长度>0){
s+=此[0]。toString();
对于(var i=1;i=sH.length | | fH[fHC][0]如果(fH[fHC][1]您遗漏了一个增量:

Array.prototype.toString = function(){
  var s = "[";
  if(this.length > 0){
    s += this[0].toString();
    for(var i = 1; i < this.length; i++){
      s += ", " + this[i].toString();
    }
  }
  s += "]";
  return s;
}

var edges = [['D', 'F'], ['A', 'D'], ['F', 'I'], ['B', 'E'], ['B', 'J'],
             ['A', 'C'], ['E', 'G'], ['A', 'J'], ['G', 'H']];

function sortEdges(edges){
  // mergesort
  // split up
  if(edges.length < 2){
    return edges;
  } else {
    var fH = edges.slice(0, Math.floor(edges.length / 2)); // fH: firstHalf
    var sH = edges.slice(Math.floor(edges.length / 2), edges.length); // sH: firstHalf

    console.log(fH.toString());
    console.log(sH.toString());

    fH = sortEdges(fH);
    sH = sortEdges(sH);

    // merge
    var fHC = 0; // fHC: firstHalfCounter
    var sHC = 0; // sHC: secondHalfCounter

    var bothHalves = new Array();
    for(var i = 0; i < edges.length; i++){
      console.log("fHC: " + fHC + ", sHC: " + sHC + ", bothHalves: " + bothHalves.toString());
      if(fHC < fH.length && (sHC >= sH.length || fH[fHC][0] < sH[sHC][0])){ 
        // compare 'from' vertex
        bothHalves.push(fH[fHC]);
        fHC++;
      } else if(fHC < fH.length && fH[fHC][0] == sH[sHC][0]){ 
        // if tied, compare 'to' vertex
        if(fH[fHC][1] <= sH[sHC][1]){
          bothHalves.push(fH[fHC]);
          fHC++;
        } else {
          bothHalves.push(sH[sHC]);
          sHC++;
         //  ^^ You left out this increment   <--------------HERE----------------
        }
      } else {
        bothHalves.push(sH[sHC]);
        sHC++;
      }
    }
    return bothHalves;
  }
}
edges = sortEdges(edges);
console.log(edges.toString());
Array.prototype.toString=function(){
var s=“[”;
如果(此长度>0){
s+=此[0]。toString();
对于(var i=1;i=sH.length | | fH[fHC][0]if(fH[fHC][1]想必你知道JavaScript有一个内置的
sort
函数,使用起来会容易得多?它会对数组进行排序吗?如果是的话,那么是的,我可能应该使用它。至少这是有教育意义的。是的。数组有一个内置函数。不需要编写自己的。我必须编写自己的比较函数但要处理这两个元素的字母排序,这可能比从头开始编写排序要复杂得多。谢谢你的链接。哇,谢谢你。我真不敢相信我没有发现。先生/女士,你真是个救命恩人。@AmadeusDrZaius确实如此。昨天我花了30分钟才发现我在gr时没有解析从文本框中缩写和
“11”+9
并不等于
20
…Ha。