【问题标题】:Why is this Merge Sort java script implementation not working? [closed]为什么这个合并排序 java 脚本实现不起作用? [关闭]
【发布时间】:2012-07-24 00:19:23
【问题描述】:

我已经尝试了一整天,但似乎无法找出它为什么不起作用。我认为问题在于我的 JavaScript 语言技能。我可能会遗漏一些关于参数传递的概念。你能告诉我错误在哪里吗?

这是我的实现,基于我一年前用 C# 编写的另一个实现,可以在 here 找到。

这里是代码(您可以直接在 Chrome 控制台上尝试,只需复制/粘贴即可“工作”):

function merge(A, p, q, r){
    var n1 = q - p + 1;
    var n2 = r - q;

    var i = 0;
    var j = 0;

    var L = [];
    while (i < n1){
        L.push(A[p + i++]);
    }

    var R = [];
    while(j < n2){
        R.push(A[q + j++ + 1]);
    }

    L.push(Number.MAX_VALUE);
    R.push(Number.MAX_VALUE);

    i = 0; 
    j = 0; 

    var k = p;
    while(k <= r){
        if(L[i] <= R[i]){
            A[k] = L[i];
            i = i + 1;
        }else{
            A[k] = R[j];
            j = j + 1;
        }

        k = k + 1;
    }
}

function mergeSort(A, p, r){
    console.log(A);

    if(p < r){
        var q = Math.floor((p + r) / 2);

        mergeSort(A, p, q); 
        mergeSort(A, q + 1, r);
        merge(A, p, q, r);
    }
}

function testMergeSort(array){
    var p = 0;
    var r = array.length - 1;

    console.log("BEFORE: " + array);

    mergeSort(array, p, r);

    console.log("AFTER: " + array);
    console.log("---------------------------------");
}

testMergeSort([5, 2, 4, 7, 1, 3, 2, 6]);

【问题讨论】:

  • 我没有正确检查你的代码,但我可以告诉你它太长了。合并排序应该可以用更少的行来实现。
  • @Kay;合并排序算法 = 5 行,其余的,你没有注意到的是测试代码。合并算法与算法简介 (amazon.com/Introduction-Algorithms-Second-Edition-Thomas/dp/…) 中描述的相同。你也可以在这里看到代码:renatogama.com/blog/imagens/algoritmo-de-merge.png
  • 您的变量名选择不当。他们可能会为您节省一些击键,但会使您的代码对我们其他人来说几乎是难以理解的......
  • 啊,好的,明白了。很抱歉,除了批评您的代码之外我无能为力……但老实说,每次看到它时我都会头疼。 :-)
  • @RenatoGama 我不知道这是否是我显示器的分辨率,但我在merge(...) 中数了超过 5 行。 ;-)

标签: javascript algorithm mergesort


【解决方案1】:

一个简单的错字:

if(L[i] <= R[i]){

应该是

if(L[i] <= R[j]){

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 2019-07-31
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多