Java 通用可比较合并排序算法上的Stackoverflow错误
我在排序方法中的mergesort调用中不断收到stackoverflow错误。这可能是一个快速解决办法,但我现在想不出什么。请看一下我的密码Java 通用可比较合并排序算法上的Stackoverflow错误,java,algorithm,sorting,stack-overflow,mergesort,Java,Algorithm,Sorting,Stack Overflow,Mergesort,我在排序方法中的mergesort调用中不断收到stackoverflow错误。这可能是一个快速解决办法,但我现在想不出什么。请看一下我的密码 public class MergeSorter { public static <T> void sort(Comparable<? extends T>[] items) { if (items == null) { throw new IllegalArgumentExcep
public class MergeSorter {
public static <T> void sort(Comparable<? extends T>[] items) {
if (items == null) {
throw new IllegalArgumentException("Item is null.");
}
mergeSort(items, 0, items.length - 1);
}
@SuppressWarnings("unchecked")
private static <T> void mergeSort(Comparable<? extends T>[] items, int begIndx, int endIndx) {
if(begIndx == endIndx) {
return;
}
if(items.length > 1) {
int midIndx = items.length / 2;
mergeSort(items, begIndx, midIndx);
mergeSort(items, midIndx + 1, endIndx);
merge(items, begIndx, midIndx, endIndx);
}
}
@SuppressWarnings("unchecked")
private static <T> void merge(Comparable<? extends T>[] array, int begIndx, int midIndx, int endIndx) {
int sizeOfLeft = midIndx - begIndx + 1;
int sizeOfRight = endIndx - midIndx;
/// change to generic later
@SuppressWarnings("unchecked")
T[] leftArr = (T[]) new Object[sizeOfLeft + 1];
@SuppressWarnings("unchecked")
T[] rightArr = (T[]) new Object[sizeOfRight + 1];
for (int i = 0; i <= sizeOfLeft; i++) {
leftArr[i] = (T) array[begIndx + i];
}
for (int j = 0; j <= sizeOfRight; j++) {
rightArr[j] = (T) array[midIndx + j + 1];
}
int i = 0;
int j = 0;
for (int k = begIndx; k <= endIndx; k++) {
if (i == sizeOfLeft) {
array[k] = (Comparable<? extends T>) rightArr[j++];
} else if(j == sizeOfRight) {
array[k] = (Comparable<? extends T>) leftArr[i++];
} else if(((Integer) leftArr[i]).compareTo((Integer)rightArr[j]) <= 0) {
array[k] = (Comparable<? extends T>) leftArr[i++];
} else {
array[k]=(Comparable<? extends T>) rightArr[j++];
}
}
}
}
公共类合并分类器{
publicstaticvoidsort(Comparable您的问题是您总是将中间索引基于items.length,每次调用都是相同的
对于该调用,中间索引应该在begIndx和endIndx之间的一半,这才是重要的。int midIndx=(begIndx+endIndx)/2;