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

合并排序输出内存错误

颜云瀚
2023-03-14

我试图实现一个MergeSort递归算法来对一个数组进行排序,但是我一直在合并部分遇到这个问题,我不明白为什么会出现这个错误:

线程“main”中的异常 java.lang.OutOfMemory错误:Java 堆空间 它在第 21 行标记错误

这是合并部分的代码,递归部分似乎没有问题

public static void Intercala(ArrayList<Alumno> L, int ini, int mitad, int fin){
    int i=ini;
    int j= mitad+1;
    int k = ini;
    ArrayList<Alumno> B = new ArrayList <Alumno>();

    while(i<=mitad && j<=fin){
        if (L.get(i).get_matri() <= L.get(j).get_matri()){
            B.add(k,L.get(i));
            i++;
        }
        else{
            B.add(k,L.get(j));
            j++;
        }
        k++;

    }
    if (i>mitad){
        for(int h=j; h<=fin; k++){
            B.add(k,L.get(h));
        }
            k++;
    }
    else{
        for (int h=i; h<=mitad;k++){
            B.add(k,L.get(h));
        }
        k++;
    }
    for(i=ini; i<=fin; i++){
        L.set(i, B.get(i));
    }
}

有人能帮帮我吗?我已经试着重新检查代码,但似乎没有任何帮助。

编辑:已经尝试扩展内存,仍然抛出这个错误

共有2个答案

章子航
2023-03-14

在time循环之后。

if (i>mitad){
    for(int h=j; h<=fin; k++){
        B.add(k,L.get(h));
    }
        k++;
}
else{
    for (int h=i; h<=mitad;k++){
        B.add(k,L.get(h));
    }
    k++;
}

这两个for循环将无限运行。

因为h在循环中不会改变。

南宫喜
2023-03-14

查看代码,我没有看到逻辑有任何问题。我能得出的唯一结论是ArrayList如何分配内存。默认大小为10,当达到限制时,您将分配的内存翻倍。它继续这样做。

问题也可能是对象校友占用了多少内存。随着 ArrayList 内存分配的这种爆炸式增长,空间可能会耗尽。如果你想使用List,我建议使用LinkedList,当你达到容量时,大小不会自动翻倍。

您的递归函数可能有问题,但我假设它是正确的。

希望这有帮助!

 类似资料:
  • 双向合并排序与递归合并排序有何不同? 假设在合并排序中有5个数字需要排序8,9,1,6,4,我们按如下步骤1进行划分:{8,9,1}{6,4} 步骤2:{8,9}{1}{6}{4} 步骤3:{8}{9}{1}{6}{4} 现在合并 步骤4:{8,9}{1}{4,6} 步骤5:{1,8,9}{4,6} 第六步:{1,4,6,8,9} 但在双向合并排序中,我们将数组分为两个元素(但根据维基百科,在合并

  • 本文向大家介绍合并排序,包括了合并排序的使用技巧和注意事项,需要的朋友参考一下 合并排序技术基于分而治之。我们将整个数据集分成较小的部分,然后按排序顺序将它们合并成较大的部分。在最坏情况下它也非常有效,因为该算法在最坏情况下的时间复杂度也较低。 合并排序技术的复杂性 时间复杂度: 所有情况下为O(n log n) 空间复杂度:  O(n) 输入输出 算法 合并(数组,左,中,右) 输入- 数据集数

  • 以下是我在Leetcode上解决“合并两个排序列表”算法问题的代码: 我得到了一个运行时错误。但是我的代码有什么问题?

  • 本文向大家介绍Haskell合并排序,包括了Haskell合并排序的使用技巧和注意事项,需要的朋友参考一下 示例 有序合并两个有序列表 保留重复项: 自顶向下版本: 定义这种方式是为了清楚而非效率。 使用示例: 结果: 自下而上的版本:            

  • 我有三个列表,我们称它们为列表1、列表2和列表3。 清单1和2作为参数由函数接收,清单3在函数中创建。 清单3的显示如下:4日1月1日2月2日8月1日3月1日4月1日5月1日9月1日7月1日7月1日10月1日11月1日12月1日

  • 我正试图想出一个分而治之的算法来合并j个排序列表和n个元素,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望合并算法更高效,如下所示: 合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表合并,以此类推,该列表取O(j*jn)。