Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MergeSort递归中的java.lang.StackOverflower错误_Java_Sorting - Fatal编程技术网

MergeSort递归中的java.lang.StackOverflower错误

MergeSort递归中的java.lang.StackOverflower错误,java,sorting,Java,Sorting,我尝试调试10个大小的列表。 ascendingSort(list,start,partition)运行良好。但是在递归ascendingSort(list,start,partition)之后,ascendingSort(list,partition,end)失败,它的start,end不是5 10,而是0 1 public <T extends Comparable<T>> void ascendingSort(List<T> list) { as

我尝试调试10个大小的列表。
ascendingSort(list,start,partition)
运行良好。
但是在递归
ascendingSort(list,start,partition)
之后,
ascendingSort(list,partition,end)
失败,它的start,end不是5 10,而是0 1

public <T extends Comparable<T>> void ascendingSort(List<T> list) {
    ascendingSort(list, 0, list.size());
}

private <T extends Comparable<T>> void ascendingSort
        (List<T> list, int start, int end) {
    if (start == end) {
        return;
    }
    int partition = (start + end) >> 1;
    ascendingSort(list, start, partition);
    ascendingSort(list, partition, end);
    merge(list, start, partition, end);
}

private <T extends Comparable<T>> void merge
        (List<T> list, int start, int partition, int end) {
    List<T> leftList = new ArrayList<>();
    List<T> rightList = new ArrayList<>();
    Collections.copy(leftList, list.subList(start, partition));
    Collections.copy(rightList, list.subList(partition, end));
    int i = 0, j = 0;
    for (int k = start; k < end; k ++) {
        T leftElement = leftList.get(i);
        T rightElement = rightList.get(j);
        if (leftElement.compareTo(rightElement) > 0) {
            list.set(k, rightElement);
            j++;
        } else {
            list.set(k, leftElement);
            i++;
        }
    }
}
public void ascendingSort(列表){
ascendingSort(list,0,list.size());
}
私人空间上升运动
(列表、整数开始、整数结束){
如果(开始==结束){
返回;
}
int分区=(开始+结束)>>1;
升序排序(列表、开始、分区);
升序排序(列表、分区、结束);
合并(列表、开始、分区、结束);
}
私有无效合并
(列表、int开始、int分区、int结束){
List leftList=new ArrayList();
List rightList=new ArrayList();
Collections.copy(leftList,list.subList(start,partition));
Collections.copy(rightList,list.subList(partition,end));
int i=0,j=0;
for(int k=start;k0){
list.set(k,rightElement);
j++;
}否则{
list.set(k,leftElement);
i++;
}
}
}

代码中有几个问题:

if (start == end) {
    return;
}
如果不正确,则应使用下一段代码:

if (end - start < 2) {
    return;
}

在此之后,您将有一个异常
IndexOutOfBoundException
,因为在合并循环中没有检查列表大小。请检查此项以实现数组的合并排序,并对列表执行相同操作。

您正在检查的此0,1位于第一个ascendingSort的递归调用完成时,参数为list,0,1。
List<T> leftList = new ArrayList<>(list.subList(start, partition));
List<T> rightList = new ArrayList<>(list.subList(partition, end));