Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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 这个简单的mergeSort代码给出了错误的答案。有人能找到窃听器吗?_Javascript_Mergesort_Lexical - Fatal编程技术网

Javascript 这个简单的mergeSort代码给出了错误的答案。有人能找到窃听器吗?

Javascript 这个简单的mergeSort代码给出了错误的答案。有人能找到窃听器吗?,javascript,mergesort,lexical,Javascript,Mergesort,Lexical,问题似乎是mergeSort将[300200100]划分为[300200]和[100]。然后它成功地将[300200]合并并排序到[200300]中。现在问题出现了:该算法没有将[200300]与[100]合并,而是在[300]与[100]之间运行排序过程。我怀疑这个问题是因为Javascript的闭包,因为j的值在某一点上得到了不同的解释。有人能帮我吗 function mergeSort(A,start,end){ console.log("Sorting " + A + " bet

问题似乎是mergeSort将[300200100]划分为[300200]和[100]。然后它成功地将[300200]合并并排序到[200300]中。现在问题出现了:该算法没有将[200300]与[100]合并,而是在[300]与[100]之间运行排序过程。我怀疑这个问题是因为Javascript的闭包,因为j的值在某一点上得到了不同的解释。有人能帮我吗

function mergeSort(A,start,end){
    console.log("Sorting " + A + " between " + start + " and " + end)
    if (start==end){
        console.log("Reached singleton element: " + A[start])
        return;
    } 

    j = Math.floor((end+start)/2);

    mergeSort(A,start,j);
    console.log("Sorted " + A + " between " + start + " and " + j + ". Now sorting between " + (j+1) + " and " + end)
    mergeSort(A,(j+1),end);
    merge(A,start,(j+1),end);
    return A
}  

function merge(A,s,p,e){ 
    var i = s;
    var j = p;
    var finalArray = [];
    while(i < p && j < e+1){
        if (A[i] <= A[j]){
            finalArray[i+j-s-p] = A[i];
            i++
        } 
        else if (A[j] < A[i]){
               finalArray[i+j-s-p] = A[j];
               j++
        }  
    }

    if (i == p){
        while (j < e+1 ){
            finalArray[i-s+j-p] = A[j];
            j++
        }
    }

    if (j == e+1){
        while (i < p ){
            finalArray[i-s +j-p] = A[i];
            i++ 
       }    
    }

    for(var q = s; q <e+1;q++){
        A[q] = finalArray[q-s]
    }
}



A = [300,200, 100] // Gives [ 200, 100, 300 ]
mergeSort(A, 0, (A.length-1));
函数合并排序(A、开始、结束){
console.log(“在“+start+”和“+end”之间排序“+A+”)
如果(开始==结束){
log(“到达的单例元素:+A[start])
回来
} 
j=数学楼层((结束+开始)/2);
合并排序(A,开始,j);
log(“在“+start+”和“+j+”之间排序“+A+”。现在在“+(j+1)+”和“+end”之间排序)
合并排序(A,(j+1),结束);
合并(A,开始,(j+1),结束);
归还
}  
函数合并(A,s,p,e){
var i=s;
var j=p;
var finalArray=[];
而(i如果(A[i]这是一个范围问题。更改j的声明可以解决它:

let j = Math.floor((end+start)/2);
我重构了合并函数。我没有重命名变量的唯一原因是我在移动设备上。有更多js知识的人可能有更多的改进:

function merge(A,s,p,e) { 
    let i = s;
    let j = p;
    let finalArray = [];
    while(i < p && j <= e) {
        if (A[i] <= A[j]) {
            finalArray.push(A[i])
            i++
        } 
        else {
            finalArray.push(A[j])
            j++
        }  
    }

    while (j <= e) {
        finalArray.push(A[j]);
        j++
    }

    while (i < p) {
        finalArray.push(A[i]);
        i++  
    }

    for(let q = s; q <= e; q++) {
        A[q] = finalArray[q-s]
    }
}
函数合并(A,s,p,e){ 设i=s; 设j=p; 设finalArray=[];
while(ilet
,而不是
var
,看看这能不能解决问题。我对javascript不是很精通,但你确定你可以在数组中分配随机索引而不必使用任何代码阵列已经有那么大了?用推就行了。哇!谢谢!