当前位置: 首页 > 知识库问答 >
问题:

为什么这种合并排序实现不起作用?

曾元忠
2023-03-14

我第一次用一个辅助数组实现了合并排序,以尝试使用JavaScript实现可视化。这似乎应该是有效的,但它不是。任何帮助或提示将不胜感激。

const merge = (array, auxArray, start, mid, end) => {
  let k = start; 
  let i = start;
  let j = mid + 1;
  while (i <= mid && j <= end) {
    if (auxArray[i] <= auxArray[j]) {
      array[k++] = auxArray[i++];
    } else {
      array[k++] = auxArray[j++];
    }
  }
  while(i <= mid) {
    array[k++] = auxArray[i++];
  }
  while(j <= end) {
    array[k++] = auxArray[j++];
  }
}


const mergeSortHelper = (array, auxArray, start, end) => {
  if (start === end) {
    return;
  }
  let mid = Math.floor((start + end)/2);
  mergeSortHelper(array, auxArray, start, mid);
  mergeSortHelper(array, auxArray, mid + 1, end);
  merge(array, auxArray, start, mid, end);
}


const mergeSort = (array) => {
  let auxArray = array.slice();
  mergeSortHelper(array, auxArray, 0, array.length - 1);
};

编辑:我忘了包括它不起作用的情况。它们是:

输入:[4, 2, 5, 6, 7, 7]输出:[4, 2, 5, 6, 7, 7]

输入:[6,6,6,4,6,2]输出:[4,6,6,6,6,2]

输入:[6, 7, 3, 10, 7, 9, 6, 3, 4, 6]输出:[6, 7, 3, 9, 6, 3, 4, 6, 10, 7]

它对所有大小的数组给出了类似的结果,但对大小为2的数组似乎给出了正确的结果。

在初始化数组(比如a)后,我用mergeSort(a)调用mergeSort函数,然后通过将数组a记录到控制台来检查它是否被排序。数组应该被排序,但它不是。大多数时候数组保持不变,但有时数组略有不同,但没有排序。

共有1个答案

淳于祺
2023-03-14

考虑排序数组[4,3,2,1]的情况

let array = [4,3,2,1];
mergeSort(array);
    auxArray = <copy of array>
    mergeSortHelper(array, auxArray, 0, 3);
        mergeSortHelper(array, auxArray, 0,1);
            mergeSortHelper(array, auxArray, 0,0); // returns immediately
            mergeSortHelper(array, auxArray, 1,1); // returns immediately
            merge(array, auxArray, 0,1);  // arr[0-1] = {3,4}
        mergeSortHelper(array, auxArray, 2,3);    
            mergeSortHelper(array, auxArray, 0,0); // returns immediately
            mergeSortHelper(array, auxArray, 1,1); // returns immediately
            merge(array, auxArray, 0,1);  // arr[2-3] = {1,2}
        <at this point arr is [3,4,1,2] and auxArray is still [4,3,2,1]
        merge(array, auxArray, 0,1);  // OOPS, you are remerging the junk in auxArray back into array

问题是,当你向下递归时,你会把每个1或2个元素集的排序内容放入arr,但当你向后递归时,你会把auxArray中未排序的内容重新合并到数组中。

简单的解决方法是将array的内容复制回auxArray函数末尾的merge中。

  ...

  while(j <= end) {
    array[k++] = auxArray[j++];
  }

  // ADD THIS LOOP TO THE END OF YOUR merge FUNCTION
  for (t = 0; t < array.length t++) {
     auxArray[t] = array[t];
  }
}

但这里有另一个提示。摆脱auxArray。你不需要它。或者如果你这样做了,只需声明并使用它merge

 类似资料:
  • 我从这里得到了帮助,但我特别不想宣布我的方法无效。任何帮助都将不胜感激! 这是我的合并排序的实现,我得到的输出是5 4 3 2 1 10 9 8 7 6。 有人能帮我弄清楚我该怎么做吗? 我不想将mergesort和merge方法声明为void,而是希望它们返回排序后的数组。提前谢谢。

  • 我的任务是使用用户填充的int数组合并两个数组,我们必须假设用户最多有10000个输入,用户输入负数停止。然后将数组从最小到最大排序并打印出来。起初我以为这很容易,但当我完成时,我开始得到如下输出: 正如你所看到的,这六个是不合适的,我不知道如何修复它。这是源代码,我已经包括了大量的评论,因为我真的希望你们能帮助我尽你们最大的能力。如果可以使用相同的技术而不在代码中实现新的技术和方法,请这样做。我

  • 问题内容: 我有以下代码: 我希望它能打印a = 2 b = 1,但它却打印相反的东西。因此很明显,swap方法不会交换a和b值。为什么? 问题答案: 这与整数的不变性无关。它与 Java是值传递 ,该死 的事实有关! (不烦恼,只是文章标题:p) 总结一下:您实际上不能在Java中创建交换方法。您只需要在需要的地方自己进行交换即可。反正这只是三行代码,所以应该不成问题:)

  • 我有一个h2作为唯一的项目在一个容器div。我在容器上使用position:relative和h2上使用position:absolute/bottom:0使它与容器底部对齐。但是,我无法使h2文本与容器div的右侧对齐。 HTML: CSS: 链接:http://www.distributionaccess.com/new/stempath/about.html 我在h2上尝试了display:

  • 我在move\u r函数中有after语句。但当我点击空格键时,它说 我相对知道这意味着什么,但我不知道该怎么改变我的程序应该画一个火箭,然后当你点击太空时,火箭向上移动。不幸的是,我的程序每次点击空格只会上升100次,而不是一次点击空格就自动上升,这是我的目标。我的代码是:

  • 问题内容: 我们知道快速排序是最快的排序算法。 JDK6 使用合并排序算法而不是快速排序。但是Arrays.sort使用快速排序算法。 Collections.sort使用合并排序而不是快速排序的原因是什么? 问题答案: 极有可能从乔希布洛赫§: 我确实写了这些方法,所以我想我有资格回答。确实没有最佳的排序算法。与mergesort相比,QuickSort有两个主要缺陷: 它不稳定(如parsif