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

时间:2017-07-10 18:13:19

标签: javascript sorting recursion merge mergesort

我正在javascript中从头开始编写自己的递归合并排序函数,但是任何时候我用任何数字数组测试它都会收到以下错误:“TypeError:无法读取未定义的属性'长度'

我不知道为什么我收到此错误,因为我使用“length”属性的唯一地方是我的争论arrray(在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 个答案:

答案 0 :(得分:1)

修改看起来您在修改中定义了$('#mySelect').html( $.map(selectValues, function(val, key){ return '<option value="' + val + '">'+ key + '</option>'; }).join('')); ,因此唯一的问题是您必须在arrayLength return merge(...) >

以下是该算法的固定版本:

&#13;
&#13;
mergeSort
&#13;
&#13;
&#13;

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