MergeSort递归中的java.lang.StackOverflower错误
我尝试调试10个大小的列表。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
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));