简体   繁体   English

Java 自顶向下合并排序 - Stackoverflow 错误

[英]Java Top-Down Merge Sort - Stackoverflow Error

I am trying to implement the top-down merge sort algorithm in Java, using the pseudocode from Wikipedia .我正在尝试使用Wikipedia 中的伪代码在 Java 中实现自上而下的合并排序算法。

My problem is that my code sometimes throws a StackOverflowError, but not always.我的问题是我的代码有时会抛出 StackOverflowError,但并非总是如此。 I have checked that my code matches the pseudocode several times and cannot find what is wrong with it.我已经多次检查我的代码是否与伪代码匹配,但找不到它有什么问题。

Here is my Java code:这是我的 Java 代码:

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;
    }
}

Your algorithm encounters issues when there are duplicate elements, as indexOf will only return the index of the first one.当存在重复元素时,您的算法会遇到问题,因为indexOf只会返回第一个元素的索引。 Use a index-based for loop instead.请改用基于索引的for循环。 Demo演示

for (int i = 0; i < m.size(); i++) {
    if (i < (m.size()) / 2)
        left.add(m.get(i));
    else {
        right.add(m.get(i));
    }
}

In the mergeSort method need to change the for loop little bit and try again.在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));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 尝试在 Java 中编码合并排序时出现 StackOverFlow 错误 - Getting StackOverFlow error while trying to code Merge Sort in Java 如何在Java中创建自上而下的重载构造函数 - How to create a top-down overload constructor in java 自上而下的解析与递归语法 - Top-Down Parsing with recursive grammar 如何使用自上而下的 web 服务? - How to consume a top-down web service? 从零开始的2D自上而下Java(1.8)游戏(无) - 2D Top-Down Java (1.8) Game from Scratch(nothing) 用自上而下的方法用Java设计API - 写Javadoc是最好的起点吗? - Designing APIs in Java with top-down approach - Is writing up the Javadoc the best starting point? 需要帮助以自上而下的射击游戏(Java)使图像旋转以面对鼠标 - Need help getting image to rotate to face the mouse in a top-down shooter (Java) HotSpot JIT内联策略:自上而下或下至上 - HotSpot JIT inlining strategy: top-down or down-top 自顶向下的汽车在JBox2D libGDX运动问题 - Top-Down Car in JBox2D libGDX movement issues 最小硬币自上而下的解决方案没有给出预期的结果 - minimum coin top-down solution is not giving expected results
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM