2016-09-16 2 views
0

Я хочу улучшить алгоритм сортировки слиянием, чтобы он сортировал два массива и удалял дубликаты. я придумал следующий код:Введен в массив функций undefined

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) 

, который гласит, что компилятор не может вычислить длину не определено. я не понимаю, почему второй массив не определен внутри функции и как это исправить

ответ

4

Проблема заключается с

return merge(mergeSortEnhanced(left), mergeSortEnhanced(right)); 

вы передаете только первый параметр в функции здесь, таким образом, второй один не определен , может быть, вы хотели бы сделать

return merge(left, right); 

BTW только как совет - быть предельно осторожным с рекурсией

+0

Ой, как я могу быть слепым. Я исправил эту ошибку, проверив, если arr2! = Undefined. он работает сейчас, спасибо – Atin

3

Добавить проверку перед временем. Обновите свой код как

if (arr2){ 
    while(arr2.length) 
    { 
     arr.push(arr2.shift()); 
    } 
} 

Метод shift() удаляет первый элемент массива и возвращает этот элемент. Таким образом, после 4 итераций ваш arr2 становится неопределенным.

Смежные вопросы