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

我的合并排序代码有什么问题?

孟和玉
2023-03-14

我在计算机课上遇到了合并排序的问题。我不断收到错误或返回原始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;
}

我将感谢任何帮助,但是请不要给我一个完整的合并排序的实现,因为我想真正学习如何在未来做到这一点。

共有2个答案

卜勇
2023-03-14

如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的运行,只需使用索引在原始数组和临时数组之间进行来回合并。

吴英武
2023-03-14

我看到两个迫在眉睫的问题。

首先,你有无限递归。假设您传入一个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中为另一个所需部分编写了代码,我不知道该如何调用它,但我只是称它为“比较和排序部分”。 你有两个向量,这个部分应该比较最开始的元素,取较小的元素,然后删除选择的元素,把它放入一个新的向量中。这样做,直到两个向量的大小