Максимальный размер стека вызовов превышен при сортировке слиянием

1

Я изучаю сортировку слияния и реализую ее в JavaScript, но она возвращает ошибку:

функция mergeSort (ввод) {

RangeError: превышен максимальный размер стека вызовов

Вот мой код:

var array = [2,4,6,7,1,3,5,10,9,8];

// using merge sort: (best sort => O (n log n))
function mergeSort (array) {
var array1 = [];
var array2 = [];

for (let i = 0; i < array.length/2; i++) {
    array1.push(array[i]);
}

for (let i = array.length/2; i < array.length; i++) {
    array2.push(array[i]);
}

array1 = mergeSort(array1);
array2 = mergeSort(array2);

return merge(array1, array2);
}

function merge(a, b) {
let c = [];

while(a.length > 0 && b.length > 0) {
    if (a[0] > b[0]) {
        c.push(b[0]);
        b.splice(0, 1);
    } else {
        c.push(a[0]);
        a.splice(0, 1);
    }
}

while (a.length > 0) {
    c.push(a[0]);
    a.splice(0, 1);
}

while (b.length > 0) {
    c.push(b[0]);
    b.splice(0, 1);
}

return c;
}

console.log(mergeSort(array));

Я думаю, ошибка в функции mergeSort. Я реализую его с рекурсией.

  • 0
    mergeSort принимает smt, но smt не используется, а что такое массив?
  • 0
    Здравствуйте, @Keitaro. Вам удалось решить вашу проблему?
Показать ещё 2 комментария
Теги:
algorithm
mergesort

1 ответ

3
Лучший ответ

Эта особая причина связана с бесконечной рекурсией внутри функции mergeSort. Вы называете его все глубже и глубже, без каких-либо условий остановиться. Поэтому mergeSort следует переписать следующим образом:

function mergeSort(input) {
  // Here is your recursion stop condition
  if (input.length === 1) return input;

  const median = Math.floor(input.length / 2);

  // Limit arrays should get sliced with each iteration
  const limitA = input.slice(0, median);
  const limitB = input.slice(median);

  return merge(
    mergeSort(limitA), mergeSort(limitB)
  );
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню