我第一次用一个辅助数组实现了合并排序,以尝试使用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
记录到控制台来检查它是否被排序。数组应该被排序,但它不是。大多数时候数组保持不变,但有时数组略有不同,但没有排序。
考虑排序数组[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