【问题标题】:Merge Sort JavaScript Implementation [closed]合并排序 JavaScript 实现 [关闭]
【发布时间】:2018-08-01 23:31:06
【问题描述】:

我正在学习可汗学院的算法课程。
我通常会尝试自己找出示例,但这次我真的不明白。练习在:Khan Academy Merge Sort Exercise.
所以我请一个好心的人为我解决这个练习,因为我被卡住了,这是我第一次无法实现某些东西。我确信我会在解决方案之后理解该算法(我想我会,但它在实现时给了我错误,所以显然我不理解)。
这是我到目前为止所做的代码:

// Takes in an array that has two sorted subarrays,
//  from [p..q] and [q+1..r], and merges the array
var merge = function(array, p, q, r) {
    // This code has been purposefully obfuscated,
    //  as you'll write it yourself in next challenge.
    var a=[],b=[],c=p,d,e;for(d=0;c<=q;d++,c++){a[d]=array[c];}for(e=0;c<=r;e++,c++){b[e]=array[c];}c=p;for(e=d=0;d<a.length&&e<b.length;){if(a[d]<b[e]){array[c]=a[d];d++;} else {array[c]=b[e]; e++;}c++; }for(;d<a.length;){array[c]=a[d];d++;c++;}for(;e<b.length;){array[c]=b[e];e++;c++;}
};


// Takes in an array and recursively merge sorts it
var mergeSort = function(array, p, r) {
    if(r > 1) {
        var q = Math.floor((p + r) / 2);
        mergeSort(array,p,q);
        mergeSort(array,q+1,r);
        merge(array, p, q, r);
    }

};

var array = [14, 7, 3, 12, 9, 11, 6, 2];
console.log(''+array);
mergeSort(array, 0, array.length-1);
console.log("Array after sorting: " + array);

// Takes in an array that has two sorted subarrays,
    //  from [p..q] and [q+1..r], and merges the array
    var merge = function(array, p, q, r) {
        // This code has been purposefully obfuscated,
        //  as you'll write it yourself in next challenge.
        var a=[],b=[],c=p,d,e;for(d=0;c<=q;d++,c++){a[d]=array[c];}for(e=0;c<=r;e++,c++){b[e]=array[c];}c=p;for(e=d=0;d<a.length&&e<b.length;){if(a[d]<b[e]){array[c]=a[d];d++;} else {array[c]=b[e]; e++;}c++; }for(;d<a.length;){array[c]=a[d];d++;c++;}for(;e<b.length;){array[c]=b[e];e++;c++;}
    };
    
    
    // Takes in an array and recursively merge sorts it
    var mergeSort = function(array, p, r) {
        if(r > 1) {
            var q = Math.floor((p + r) / 2);
            mergeSort(array,p,q);
            mergeSort(array,q+1,r);
            merge(array, p, q, r);
        }
        
    };
    
    var array = [14, 7, 3, 12, 9, 11, 6, 2];
    console.log(''+array);
    mergeSort(array, 0, array.length-1);
    console.log("Array after sorting: " + array);

【问题讨论】:

  • 展示您的尝试而不是要求完整的解决方案怎么样?从你自己的代码中找到问题会比你复制粘贴一个现成的解决方案更有用。
  • @Teemu 我的尝试是我给你的代码
  • 是吗?那么请使用有意义的变量名,这是成功的第一步。
  • 这里的错误是什么?什么地方出了错?控制台中是否显示错误?你能隔离问题吗?您是否尝试过记录每个步骤?请不要指望人们会发现错误,为您修复它,然后进行相同的解释。
  • 检查您的基本情况。递归需要什么时候结束? pr 有什么值?

标签: javascript algorithm mergesort


【解决方案1】:

它与if 条件有关

if 条件实现的是检查数组末尾的r 是否大于数组开头的p

我不确定r &gt; 1 想要做什么。因此它不会得到满足并递归执行,直到它用完堆栈空间

// Takes in an array that has two sorted subarrays,
//  from [p..q] and [q+1..r], and merges the array
var merge = function(array, p, q, r) {
  // This code has been purposefully obfuscated,
  //  as you'll write it yourself in next challenge.
  var a = [],
    b = [],
    c = p,
    d, e;
  for (d = 0; c <= q; d++, c++) {
    a[d] = array[c];
  }
  for (e = 0; c <= r; e++, c++) {
    b[e] = array[c];
  }
  c = p;
  for (e = d = 0; d < a.length && e < b.length;) {
    if (a[d] < b[e]) {
      array[c] = a[d];
      d++;
    } else {
      array[c] = b[e];
      e++;
    }
    c++;
  }
  for (; d < a.length;) {
    array[c] = a[d];
    d++;
    c++;
  }
  for (; e < b.length;) {
    array[c] = b[e];
    e++;
    c++;
  }
};


// Takes in an array and recursively merge sorts it
var mergeSort = function(array, p, r) {
  if (r > p) {
    var q = Math.floor((p + r) / 2);
    mergeSort(array, p, q);
    mergeSort(array, q + 1, r);
    merge(array, p, q, r);
  }

};

var array = [14, 7, 3, 12, 9, 11, 6, 2];
console.log('' + array);
mergeSort(array, 0, array.length - 1);
console.log("Array after sorting: " + array);

【讨论】:

  • 就是这样。太感谢了。我试过r &gt; 1r - p &gt; 0,但没有一个被接受。再次感谢您与我@thebenman 的坚持,尽管有些人不明白我已经尽了最大努力,并且反复寻求关于 stackoverflow 的解决方案是一种绝望的措施。祝福你的一生
  • 谢谢。 r - p &gt; 0r &gt; p 相同,不知道为什么会失败
  • 我不确定。我不太记得了,我尝试了很多选项,但我知道我选择了 r - p &gt; 1 或者可能是 p - r &gt; 1... &gt; 0 我不确定我是否尝试过。或者也许可汗学院只接受r &gt; p。不知道,现在我真的不在乎。谢谢@thebenman ;)
猜你喜欢
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多