代码之家  ›  专栏  ›  技术社区  ›  Daniel Goldberg

递归合并排序函数错误:无法读取未定义的属性“length”

  •  0
  • Daniel Goldberg  · 技术社区  · 8 年前

    我不知道为什么我会收到这个错误,因为我使用“length”属性的唯一位置是在我的辩论array(在mergeSort函数内)和这个数组的子数组(在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{
        merge(mergeSort(firstHalf), mergeSort(secondHalf));
      }
    }
    1 回复  |  直到 8 年前
        1
  •  1
  •   Damon    8 年前

    编辑 看起来你定义了 arrayLength return merge(...) 在…的结尾 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{
        return merge(mergeSort(firstHalf), mergeSort(secondHalf));
        // ^ *** only required change made here ***
      }
    }

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