Java自顶向下合并排序-堆栈溢出错误
我试图用Java实现自顶向下的合并排序算法,使用 我的问题是,我的代码有时会抛出StackOverflower错误,但并不总是这样。我已经多次检查我的代码是否与伪代码匹配,但都找不到有什么问题 以下是我的Java代码:Java自顶向下合并排序-堆栈溢出错误,java,Java,我试图用Java实现自顶向下的合并排序算法,使用 我的问题是,我的代码有时会抛出StackOverflower错误,但并不总是这样。我已经多次检查我的代码是否与伪代码匹配,但都找不到有什么问题 以下是我的Java代码: import java.util.ArrayList; import java.util.Random; public class Main { public static void main(String[] args) { Random r = ne
import java.util.ArrayList;
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random r = new Random();
ArrayList<Integer> numbers = new ArrayList<Integer>();
for (int i = 1; i <= 15; i++) {
numbers.add(r.nextInt(100));
}
numbers = mergeSort(numbers);
System.out.println(numbers);
}
public static ArrayList<Integer> mergeSort(ArrayList<Integer> m) {
if (m.size() <= 1) {
return m;
}
ArrayList<Integer> left = new ArrayList<Integer>();
ArrayList<Integer> right = new ArrayList<Integer>();
for (Integer x : m) {
if (m.indexOf(x) < (m.size()) / 2)
left.add(x);
else {
right.add(x);
}
}
left = mergeSort(left);
right = mergeSort(right);
return merge(left, right);
}
private static ArrayList<Integer> merge(ArrayList<Integer> l, ArrayList<Integer> r) {
ArrayList<Integer> result = new ArrayList<Integer>();
while (l.size() > 0 && r.size() > 0) {
if (l.get(0) <= r.get(0)) {
result.add(l.get(0));
l.remove(0);
}
else {
result.add(r.get(0));
r.remove(0);
}
}
while (l.size() > 0) {
result.add(l.get(0));
l.remove(0);
}
while (r.size() > 0) {
result.add(r.get(0));
r.remove(0);
}
return result;
}
}
import java.util.ArrayList;
导入java.util.Random;
公共班机{
公共静态void main(字符串[]args){
随机r=新随机();
ArrayList编号=新的ArrayList();
对于(int i=1;i 0){
如果(l.get(0)0){
结果。添加(l.get(0));
l、 移除(0);
}
而(r.size()>0){
结果。添加(r.get(0));
r、 移除(0);
}
返回结果;
}
}
在mergeSort方法中,需要稍微更改for循环,然后重试
for (int i=0;i< m.size()/2;i++)
left.add(m.get(i));
for (int i=m.size()/2;i< m.size();i++)
right.add(m.get(i));
for(int i=0;i
当存在重复元素时,您的算法会遇到问题,因为indexOf
将只返回第一个元素的索引。请改用基于索引的for
循环
for(int i=0;i
也分享错误,这样更容易对错误进行分类。是的,非常感谢!!!
for (int i = 0; i < m.size(); i++) {
if (i < (m.size()) / 2)
left.add(m.get(i));
else {
right.add(m.get(i));
}
}