我在计算机课上遇到了合并排序的问题。我不断收到错误或返回原始ArrayList。
我相信合并排序涉及到将数组(列表)递归地对半拆分,直到只剩下一个元素,然后从这些单独的元素开始,按排序顺序合并它们。直到数组(列表)被排序为止。至于实际的排序部分,我试图在新的ArrayList中插入两半之间的较高值,直到它们都为空,在这种情况下,填充的ArrayList现在被排序。
这是我当前的代码:
public static ArrayList<Integer> mergesort(ArrayList<Integer> arr) {
// Base case: if size of ArrayList is 1, return it.
if (arr.size() < 2) {
return arr;
}
// Else: Find the middle index.
int middle = (arr.size() - 1) / 2;
// Split into left and right halves.
ArrayList<Integer> leftHalf = new ArrayList<Integer>();
for (int i = 0; i < middle; i++)
leftHalf.add(arr.get(i));
ArrayList<Integer> rightHalf = new ArrayList<Integer>();
for (int j = middle; j < arr.size(); j++)
rightHalf.add(arr.get(j));
// Recurse using the halves.
mergesort(leftHalf);
mergesort(rightHalf);
// Sort and merge the two halves.
return merge(leftHalf, rightHalf, arr);
}
// Merge two halves and sort them, and put the sorted values into the ArrayList sorted.
public static ArrayList<Integer> merge(ArrayList<Integer> arr1, ArrayList<Integer> arr2, ArrayList<Integer> sorted) {
// While the ArrayLists are not empty, add sorted elements to ArrayList sorted.
while (arr1.size() > 0 && arr2.size() > 0) {
// If the first element in A is greater than the first in B, remove A and add to ArrayList sorted.
if (arr1.get(0) >= arr2.get(0)) {
sorted.add(arr1.get(0));
arr1.remove(0);
}
// Else, remove from B and add to ArrayList sorted.
else {
sorted.add(arr2.get(0));
arr2.remove(0);
}
}
// If there're still elements in A due to arr being odd
// add them to C since they will be the largest.
if (arr1.size() > 0)
sorted.add(arr1.get(0));
return sorted;
}
我将感谢任何帮助,但是请不要给我一个完整的合并排序的实现,因为我想真正学习如何在未来做到这一点。
如MarquisDeMizzle所述,当arr.size()=1时,中间=1。
int middle = arr.size() / 2;
主合并循环复制完所有剩余元素后,由于您不知道arr1或arr2是先变为空,请同时选中:
// copy any remaining elements
while (arr1.size() > 0)
sorted.add(arr1.get(0));
while (arr2.size() > 0)
sorted.add(arr2.get(0));
如果感兴趣,您可能想学习自底向上的合并排序。它跳过了所有的递归,开始时假设一个包含n个元素的数组是n个大小为1的运行,只需使用索引在原始数组和临时数组之间进行来回合并。
我看到两个迫在眉睫的问题。
首先,你有无限递归。假设您传入一个4值列表,并打印列表大小和中间值,您将得到:
4号、中1号、中1号、中2号、中0号、中0号、中2号、中0号。。。无限大
记住,Java在代码中进行整数除法。
第二,如果将arr
参数从mergesort
传递到merge
,则不会从中删除任何内容。所以,即使你通过了无限递归,你最终还是会得到一个更大的列表,你原来的列表加上你所有的。添加()
我拿不到输出。。有人能帮我得到输出吗 下面给出了程序运行的示例(注意:下面的粗体文本是用户输入的输入): 输入三角形的三条边
我正在维基百科上阅读关于外部排序的文章,我需要理解为什么两阶段合并比一阶段合并更有效。 Wiki:但是,单次合并有一个限制。随着区块数量的增加,我们将内存分成更多的缓冲区,因此每个缓冲区都较小,因此我们必须进行许多较小的读取,而不是较少的较大读取。 因此,对于100 MB内存中的50 GB的排序,使用单个合并过程是没有效率的:磁盘需要用500个数据块中的每个数据块(我们一次从每个数据块读取100M
**这是我的java代码,预期输出如下: 输入第一个数字:25 输入第二个数字:5 25 x 5=125 在我插入代码并运行它之后,输出与答案相差太大 以下是输出: 如何修复我的代码?
我拿不到输出。。有人能帮我得到输出吗 下面给出了程序运行的示例(注意:下面的粗体文本是用户输入的输入): 进入三角形的三个边
本文向大家介绍Python选择排序、冒泡排序、合并排序代码实例,包括了Python选择排序、冒泡排序、合并排序代码实例的使用技巧和注意事项,需要的朋友参考一下 前两天刚装了python 3.1.1, 禁不住技痒写点code。 1.选择排序 2.冒泡排序 3.合并排序
我已经阅读并理解了Mergesort的工作原理(作为文本),现在我正在尝试对其进行编码。我已经完成了分割数据的部分(我使用向量),直到它的每个大小都为1。现在我已经在Mergesort中为另一个所需部分编写了代码,我不知道该如何调用它,但我只是称它为“比较和排序部分”。 你有两个向量,这个部分应该比较最开始的元素,取较小的元素,然后删除选择的元素,把它放入一个新的向量中。这样做,直到两个向量的大小