我试图实现一个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));
}
}
有人能帮帮我吗?我已经试着重新检查代码,但似乎没有任何帮助。
编辑:已经尝试扩展内存,仍然抛出这个错误
在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在循环中不会改变。
查看代码,我没有看到逻辑有任何问题。我能得出的唯一结论是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)。