Recursive merge sort function error: Cannot read property 'length' of undefined

Recursive merge sort function error: Cannot read property 'length' of undefined

我正在 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));
  }
}

Edit 看起来你在编辑中定义了 arrayLength,所以唯一突出的问题是你必须 return merge(...) 在 [=13] 的末尾=]

这里是算法的固定版本:

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 ***
  }
}

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