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