【问题标题】:Recursive merge sort function error: Cannot read property 'length' of undefined递归合并排序函数错误:无法读取未定义的属性“长度”
【发布时间】:2017-07-10 18:13:18
【问题描述】:

我正在用javascript从头开始编写我自己的递归合并排序函数,但是每当我用任何数字数组测试它时,我都会收到以下错误:“TypeError: Cannot read property 'length' of undefined”

我不知道为什么会收到此错误,因为我使用“length”属性的唯一位置是我争论的数组(在 mergeSort 函数内)和该数组的子数组(在合并函数内)。当给定两个任意长度的排序数组时,我的合并函数在单独测试时已经完美运行。

这是我的全部代码:

function merge(arrayOne, arrayTwo){
  let sorted = []
  while(arrayOne.length > 0 && arrayTwo.length > 0){
    if(arrayOne[0] < arrayTwo[0]){
      sorted.push(arrayOne.shift());
    } else{
      sorted.push(arrayTwo.shift());
    }
  }
  return sorted.concat(arrayOne).concat(arrayTwo);
}

function mergeSort(array){
  let arrayLength = array.length;
  let midpoint = arrayLength/2;
  let firstHalf = array.slice(0, midpoint);
  let secondHalf = array.slice(midpoint, arrayLength);
  if(arrayLength < 2){
    return array;
  } else{
    merge(mergeSort(firstHalf), mergeSort(secondHalf));
  }
}

【问题讨论】:

  • 使用给定的代码,你唯一使用长度的地方是while(arrayOne.length &gt; 0 &amp;&amp; arrayTwo.length &gt; 0){你的错误,无法读取未定义的长度,所以arrayOne和/或arrayTwo是未定义的

标签: javascript sorting recursion merge mergesort


【解决方案1】:

编辑看起来您在编辑中定义了arrayLength,所以唯一未解决的问题是您必须在mergeSort 末尾加上return merge(...)

这是算法的固定版本:

function merge(arrayOne, arrayTwo){
  let sorted = []
  while(arrayOne.length > 0 && arrayTwo.length > 0){
    if(arrayOne[0] < arrayTwo[0]){
      sorted.push(arrayOne.shift());
    } else{
      sorted.push(arrayTwo.shift());
    }
  }
  return sorted.concat(arrayOne).concat(arrayTwo);
}

function mergeSort(array){
  let arrayLength = array.length;
  let midpoint = arrayLength/2;
  let firstHalf = array.slice(0, midpoint);
  let secondHalf = array.slice(midpoint, arrayLength);
  if(arrayLength < 2){
    return array;
  } else{
    return merge(mergeSort(firstHalf), mergeSort(secondHalf));
    // ^ *** only required change made here ***
  }
}

注意:可以进行其他一些优化,但以上是解决该错误所需的对您的代码的最小更改。如果您将此作为学习练习,我建议您在完成后查看其他一些实现。

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 2020-06-02
    • 2015-02-05
    • 2017-11-25
    • 2021-02-26
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多