javascript - 使用 mergesort 计算反转 - javascript

标签 javascript merge mergesort

下面的代码统计了编号。数组中的反转。它总是递归地分成子问题,直到出现堆栈错误 RangeError: Maximum call stack size exceeded 即使定义了基本情况也会发生。这里可能是什么问题

function mergeSort(arr) {
    var n = arr.length;
    var l=0,h=n-1;
    if (l<h) {
        var m=findMid(l,h);
        var leftArr=arr.slice(l,m);
        var rightArr=arr.slice(m,n);
        var invCount = mergeSort(leftArr)+mergeSort(rightArr);
        invCount += merge(leftArr,rightArr,n);
    }
    return invCount;
}

function merge(a, b,n) {
    var i=0,j=0,m=[];
    var splitInv=0;
    for(var k=0;k<n;k++) {
        if(a[i]<b[j]) m[k]=a[i++];
        else if (b[j]<a[i]){
            m[k]=b[j++];
            splitInv+=n-i;
        }
    }
    return splitInv;
}
function findMid(l, r) {
    var m = Math.floor((l + r) / 2);
    return m;
}

我修改了上面的代码,以不同的方式处理基本情况。以下逻辑是否正确:

function mergeSort(arr) {
    var n = arr.length;
    var l=0,h=n-1;
    var invCount=0;
    if(n<=2) {
        return merge(arr[0],arr[1],n);
    }else{
        var m=Math.floor(n/2);
        var leftArr=arr.slice(l,m);
        var rightArr=arr.slice(m);
        invCount += mergeSort(leftArr)+mergeSort(rightArr);
    }
    return invCount;
}

function merge(a, b,n) {
    var i=0,j=0,m=[];
    var splitInv=0;
    if(typeof b=="undefined") {
        return 0;
    }
    for(var k=0;k<n;k++) {
        if(a[i]<b[j]) m[k]=a[i++];
        else if (b[j]<a[i]){
            m[k]=b[j++];
            splitInv+=n-i;
        }
    }
    return splitInv;
}

最佳答案

RangeError 由于对 mergeSort 的递归调用过多而出现。 对于 arr 2 的大小,rightArr 的大小将保持为 2。 代替 var rightArr=arr.slice(m,n); 你可以做 var rightArr=arr.slice(m+1,n);

关于javascript - 使用 mergesort 计算反转 - javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37908078/

相关文章:

python - Pandas 三向连接列上的多个数据框

python - 为什么 "yield"关键字没有在我的应用程序中生成预期的生成器? (归并排序算法)

javascript - 调用 .play() 会产生 "Uncaught (in promise) DOMException: The element has no supported sources."错误

javascript - 在 javascript 中,如何对数组的子集进行排序?

Git 反复 merge squash

java - 为什么合并排序用于 Android/Java API 中的对象?

time-complexity - O(n) 和 O(log n) 的乘积是多少?

javascript - Algolia:使用 AND 子句在每个字段中搜索多个值

javascript - 在 JavaScript 数组的索引中保存多个值

audio - ffmpeg 将静音视频与另一个视频+音频合并