在javascript中简单实现合并排序

时间:2016-11-12 13:15:53

标签: javascript mergesort

以下实施合并排序算法有什么问题。它只返回未定义

我怀疑错误是合并功能的某个地方。

有人可以帮我指出错误。

function merge(arr1, lower, mid, higher) {

    var i = lower;
    var j = mid + 1;
    var k = 0;
    var mergearr = [];

    while (i < j && j <= higher) {

        if (arr1[i] <= arr1[j]) {
            mergearr[k] = arr1[i];
            k++;
            i++;
        } else {
            mergearr[k] = arr1[j];
            k++;
            j++;
        }

    }

    if (i === j) {
        while (j < higher) {
            mergearr[k] = arr1[j];
            k++;
            j++;
        }
    } else if (j > higher) {
        while (i < j) {
            mergearr[k] = arr1[i];
            k++;
            i++;
        }
    }


    for (var a = 0; a <= k; a++) {
        console.log(a);
        arr1[a] = mergearr[a];
        console.log(arr1[a]);
    }

    return arr1;
}

合并功能

index: 0
 value: 4
index: 1
 value: 5
index: 2
 value: 4
index: 3
 value: undefined
index: 0
 value: 4
index: 1
 value: 4
index: 2
 value: 5
index: 3
 value: 4
index: 4
 value: undefined
index: 0
 value: undefined
index: 1
 value: 4
index: 2
 value: undefined
index: 3
 value: undefined
index: 0

这是控制台上的输出

inotifywait

2 个答案:

答案 0 :(得分:0)

在排序中放置可能的“off-by-1”错误,merge()函数在将合并列表复制回源数组的方式上存在问题。该函数被告知从lower合并到higher。但是,合并后的数组将被复制回原始数组从索引0开始。相反,您需要确保仅在lowerhigher之间修改原始数组:

for (var a = 0; a <= k; a++) {
    console.log(a);
    arr1[a + lower] = mergearr[a]; // <--- here
    console.log(arr1[a + lower]);
}

答案 1 :(得分:0)

我可以调整你的代码。是的,问题在于您的merge()功能。看看:

  • 自此值起,您不需要从merge()返回任何内容 没有在任何地方使用过。
  • a应该从lower开始,每次都会增加var arr = [5,3,7,8,1,2,6,3,2]; mergeSort(arr, 0, arr.length - 1); console.log(arr); function mergeSort(arr, lower, higher) { if (lower < higher) { var mid = Math.floor((lower + higher) / 2); mergeSort(arr, lower, mid); mergeSort(arr, mid + 1, higher); merge(arr, lower, mid, higher); } } function merge(arr, lower, mid, higher) { var l = mid-lower+1, r = higher-mid, k = lower, mergearr = [], i = 0, j = 0; while (i < l && j < r) { if (arr[lower+i] <= arr[mid+j+1]) { mergearr[k] = arr[lower+i]; i++; } else { mergearr[k] = arr[mid+j+1]; j++; } k++; } while (j < r) { mergearr[k] = arr[mid+j+1]; k++; j++; } while (i < l) { mergearr[k] = arr[lower+i]; k++; i++; } //console.log(mergearr, k, lower); for (var a = lower; a < k; a++) { arr[a] = mergearr[a]; } } 为了避免重写已排序的数组部分
  • 你的建筑拿起奇怪的指数值很奇怪 腹胀
  • 你也搞乱了函数开头的索引

&#13;
&#13;
    driver.execute_script('''
        var element = document.getElementsByClassName("quoteBox"), index;
        for (index = element.length - 1; index >= 0; index--) {
            element[index].parentNode.removeChild(element[index]);
        }
    ''')
&#13;
&#13;
&#13;