在javascript中合并排序的简单实现

Simple implementation of merge sort in javascript

本文关键字:简单 实现 排序 合并 javascript      更新时间:2023-09-26

遵循合并排序算法的实现有什么问题。 它只是返回未定义

我怀疑错误在合并函数的某个地方。

有人可以帮我指出错误吗?

    function mergeSort(arr1, lower, higher) {
    if (lower < higher) {
        var mid = Math.floor((lower + higher) / 2);
        mergeSort(arr1, lower, mid);
        mergeSort(arr1, mid + 1, higher);
        merge(arr1, lower, mid, higher);
    }
}

和合并功能

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

撇开排序中可能的"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]);
}

我可以调整你的代码。是的,问题出在您的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];
    } 
}