Java 递归排序方法不在基本情况下停止

Java 递归排序方法不在基本情况下停止,java,Java,对于学校,我正在尝试写一个递归排序算法。然而出于某种原因,它并没有停留在基本情况上,我们将非常感谢您的帮助。错误是 java.lang.StackOverflower错误 方法如下: public static List recursiveMergeSort(List<Integer> list1){ List<Integer> list = list1; List<Integer> listR = new ArrayList<>

对于学校,我正在尝试写一个递归排序算法。然而出于某种原因,它并没有停留在基本情况上,我们将非常感谢您的帮助。错误是

java.lang.StackOverflower错误

方法如下:

 public static List recursiveMergeSort(List<Integer> list1){
    List<Integer> list = list1;
    List<Integer> listR = new ArrayList<>();
   List<Integer> listL = new ArrayList<>();


     int counter =0;

    if(list.size() == 1){
        return list;
    } else {

        for (int i = 0; i <list.size()/2-1; i++){
            listL.add(list.get(i));
        }

        for(int i = list.size()/2; i  < list.size()-1; i++) {
            listR.add(list.get(i));
        }

        recursiveMergeSort(listL);
        recursiveMergeSort(listR);

        list = merge(listL, listR);
        counter++;
    }
    return (list);
}

public static List merge(List<Integer> listL, List<Integer> listR){
    int leftIndex = 0;
    int rightIndex = 0;
    int listIndex = 0;
    List<Integer> list = new ArrayList<>();
    while(leftIndex < listL.size() && rightIndex < listR.size()){
        if(listL.get(leftIndex) <= listR.get(leftIndex)){
            listR.add(listIndex, listL.get(leftIndex));
            leftIndex = leftIndex + 1;

        }else {
            list.add(list.get(listIndex), listR.get(rightIndex));
            rightIndex = rightIndex +1;
        }
        listIndex = listIndex + 1;
    }
    if(leftIndex < listL.size()){
        copyRest(listL, leftIndex, list, listIndex);
    } else {
        copyRest(listR, rightIndex, list, listIndex);
    }
    return (list);
}
公共静态列表递归合并排序(列表列表1){
列表=列表1;
List listR=new ArrayList();
List listL=new ArrayList();
int计数器=0;
if(list.size()==1){
退货清单;
}否则{

for(int i=0;i问题在于两个内部for循环:

    for (int i = 0; i <list.size()/2-1; i++){ // should be i<list.size()/2
        listL.add(list.get(i));
    }


    for(int i = list.size()/2; i  < list.size()-1; i++) { //should be i  < list.size()
        listR.add(list.get(i));
    }

for(int i=0;我猜,您的列表大小为0,完全缺少1的大小。请使用调试器检查(或添加0的测试)?即使我将基本大小写更改为,您也将丢弃
merge(listL,listR)
的结果。您可能希望执行
list=merge(listL,listR)
?很难说没有完整的代码,包括
合并()
method和
listL
listR
declarationsAh,是的,没有注意到这两个子列表不是本地的;这可能意味着在将子列表移动到方法中,并将列表更改为
list=merge(listL,listR)之后,每次调用都会无限期地添加到已经存在的列表中
是的!我现在看到了,我被-1弄糊涂了,因为我认为索引需要-1,但是<无论如何都会在比条件小1时停止。这是正确的吗?@JonathanZier,是的,<总是在比右边的数字小1时停止