1

Javaでの並べ替えの練習をしようとしています。

私は現在マージソートに取り組んでいます... Eclipseは出力Out Of Memory Error: Java Heap spaceしていますが、それをデバッグする方法がわかりません。

私のコードは大丈夫だと思います-何か考えはありますか?

import java.util.ArrayList;
import java.util.List;
public class Sorts {
    List<Integer> initialList;

    public Sorts() {
        initialList = new ArrayList<Integer>();
        initialList.add(2);
        initialList.add(5);
        initialList.add(9);
        initialList.add(3);
        initialList.add(6);

        System.out.print("List: [");
        for (int values : initialList) {
            System.out.print(values);
        }
        System.out.println("]");

        splitList(initialList);
    }

    public List<Integer> splitList(List<Integer> splitMe)   {
        List<Integer> left = new ArrayList<Integer>();
        List<Integer> right = new ArrayList<Integer>();

        if (splitMe.size() <= 1) {
            return splitMe;
        }

        int middle = splitMe.size()/2;
        int i = 0;
        for (int x: splitMe) {
            if (i < middle) {
                left.add(x);
            }
            else {
                right.add(x);
            }
            i++;
        }
        left = splitList(left);
        right = splitList(right);

        return mergeThem(left, right);
    }

    public List<Integer> mergeThem(List<Integer> left, List<Integer> right) {
        List<Integer> sortedList = new ArrayList<Integer>();
        int x = 0;
        while (left.size() > 0 || right.size() > 0) {
            if (left.size() > 0 && right.size() > 0) {
                if (left.get(x) > right.get(x)) 
                    sortedList.add(left.get(x));
                else 
                    sortedList.add(right.get(x));
            }
            else if (left.size() > 0) {
                sortedList.add(left.get(x));
            }
            else if (right.size() > 0) {
                sortedList.add(right.get(x));
            }
        }
        return sortedList;
    }   
}
4

2 に答える 2

0
while (left.size() > 0 || right.size() > 0) {

左または右からアイテムを削除しないため、終了しません。そのため、メモリが不足するまで sortedList にアイテムを追加し続けます。それらのいずれかが 0 より大きいかどうかを確認しますが、アイテムを削除することはないため、チェックが false を返すことはありません。つまり、無限ループです。

于 2013-03-22T20:39:52.200 に答える