我想增强合并排序算法,以便对两个数组进行排序并删除重复项。 我想出了以下代码:
function mergeSortEnhanced(arr, arr2)
{
while(arr2.length)
{
arr.push(arr2.shift());
}
if (arr.length < 2)
return arr;
var middle = parseInt(arr.length / 2);
var left = arr.slice(0, middle);
var right = arr.slice(middle, arr.length);
return merge(mergeSortEnhanced(left), mergeSortEnhanced(right));
}
function merge(left, right)
{
var result = [];
while (left.length && right.length) {
if (left[0] < right[0])
{
result.push(left.shift());
}
else if(left[0] > right[0])
{
result.push(right.shift());
}
else
{
result.push(left.shift());
right.shift()
}
}
while (left.length)
result.push(left.shift());
while (right.length)
result.push(right.shift());
return result;
}
var a = [1, 2 , 2 , 1];
var b = [1, 1, 6 ,8];
console.log(mergeSortEnhanced(a, b).join());
问题是我在第四行遇到错误
while(arr2.length)
指出编译器无法计算未定义的长度。我不明白为什么第二个数组在函数内部是未定义的,我该如何解决它
答案 0 :(得分:4)
问题在于
return merge(mergeSortEnhanced(left), mergeSortEnhanced(right));
这里只传递函数中的第一个参数,因此第二个参数未定义。 也许你想做
return merge(left, right);
BTW就像一个建议 - 对递归非常小心
答案 1 :(得分:3)
之前添加检查。将代码更新为
if (arr2){
while(arr2.length)
{
arr.push(arr2.shift());
}
}
shift()方法删除数组的第一项,并返回该项。因此,经过4次迭代,你的arr2变得不确定。