Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 合并排序中超出了最大调用堆栈大小_Javascript_Algorithm_Mergesort - Fatal编程技术网

Javascript 合并排序中超出了最大调用堆栈大小

Javascript 合并排序中超出了最大调用堆栈大小,javascript,algorithm,mergesort,Javascript,Algorithm,Mergesort,我正在研究合并排序并在JavaScript中实现它,但它返回了一个错误: 函数合并排序(输入){ 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

我正在研究合并排序并在JavaScript中实现它,但它返回了一个错误:

函数合并排序(输入){

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));
var数组=[2,4,6,7,1,3,5,10,9,8];
//使用合并排序:(最佳排序=>O(n logn))
函数合并排序(数组){
var array1=[];
var array2=[];
for(设i=0;i0&&b.length>0){
如果(a[0]>b[0]){
c、 push(b[0]);
b、 拼接(0,1);
}否则{
c、 推(a[0]);
a、 拼接(0,1);
}
}
而(a.length>0){
c、 推(a[0]);
a、 拼接(0,1);
}
而(b.长度>0){
c、 push(b[0]);
b、 拼接(0,1);
}
返回c;
}
log(合并排序(数组));

我猜错误在
mergeSort
函数中。我正在用递归实现它。

这一特殊原因与
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)
  );
};

mergeSort接受smt,但smt没有使用,什么是数组?你好,@Keitaro。你能解决你的问题吗?@Kiddinary噢,我最近因为项目太忙,所以忘了阅读并接受你的答案。是的,问题与停止递归的条件有关。@Keitaro很好,很乐意帮助!