Sorting 递归合并排序中的越界异常
我想知道是否有人能帮我弄清楚为什么我在这段代码中有一个越界异常。我什么都试过了。Eclipse说它发生在mergeSortRecursive和merge调用中。 谢谢大家! //包装方法Sorting 递归合并排序中的越界异常,sorting,indexoutofboundsexception,mergesort,Sorting,Indexoutofboundsexception,Mergesort,我想知道是否有人能帮我弄清楚为什么我在这段代码中有一个越界异常。我什么都试过了。Eclipse说它发生在mergeSortRecursive和merge调用中。 谢谢大家! //包装方法 public static <E extends Comparable <E>> void mergeSort (E[]list){ mergeSortRecursive(list, 0, list.length-1); } 公共静态无效合并排序(E[]列表){ mergeSo
public static <E extends Comparable <E>> void mergeSort (E[]list){
mergeSortRecursive(list, 0, list.length-1);
}
公共静态无效合并排序(E[]列表){
mergeSortRecursive(list,0,list.length-1);
}
//mergeSort recursive,接受左指针和右指针,包装类表示为0和list.length-1
private static <E extends Comparable<E>> void mergeSortRecursive(E[] list, int left,
int right) {
// Base case
if (left == right) {
return;
}
int mid = left + right / 2;
mergeSortRecursive(list, left, mid);
mergeSortRecursive(list, mid + 1, right);
merge(list, left, mid, mid + 1, right);
}
private static void mergeSortRecursive(E[]列表,左整数,
整数(右){
//基本情况
如果(左==右){
回来
}
int mid=左+右/2;
mergeSortRecursive(列表,左,中);
mergeSortRecursive(列表,中间+1,右侧);
合并(列表、左、中、中+1、右);
}
//合并两个列表
public static <E extends Comparable<E>> void merge(E[] list, int leftFirst,
int leftLast, int rightFirst, int rightLast) {
@SuppressWarnings("unchecked")
E[] mergeList = (E[]) Array.newInstance(list.getClass()
.getComponentType(), rightLast - leftFirst + 1);
int rightIndex = rightFirst;
int leftIndex = leftFirst;
int index = 0;
while (leftIndex < leftLast && rightIndex < rightLast) {
if (list[leftIndex].compareTo(list[rightIndex]) < 0) {
mergeList[index] = list[leftIndex];
leftIndex++;
} else {
mergeList[index] = list[rightIndex];
rightIndex++;
}
index++;
}
while (leftIndex < leftLast) {
mergeList[index] = list[leftIndex];
index++;
leftIndex++;
}
while (rightIndex < rightLast) {
mergeList[index] = list[rightIndex];
index++;
rightIndex++;
}
for (int i = 0; i < list.length; i++) {
list[i] = mergeList[i];
}
}
publicstaticvoidmerge(E[]列表,int leftFirst,
int leftLast,int rightFirst,int rightLast){
@抑制警告(“未选中”)
E[]合并列表=(E[])数组.newInstance(list.getClass()
.getComponentType(),rightLast-leftFirst+1);
int rightIndex=rightFirst;
int leftIndex=leftFirst;
int指数=0;
while(leftIndex
我查看了你的代码,认为我已经解决了错误。看起来有许多独立的问题共同导致程序无法正常工作
首先,一个小问题:下面是进行递归调用的代码:
int mid = left + right / 2;
mergeSortRecursive(list, left, mid);
mergeSortRecursive(list, mid + 1, right);
merge(list, left, mid, mid + 1, right);
声明mid
的行中的运算符优先级与您预期的稍有偏差。我想你是想写信
int mid = (left + right) / 2;
这实际上是两个元素的平均值
您获得的IndexOutOfBoundsException
是由于以下几行造成的:
for (int i = 0; i < list.length; i++) {
list[i] = mergeList[i];
}
这只是将合并到外部合并数组中的数组部分复制回来
如果您进行这些更改,您将开始出现一些奇怪的NullPointerException
s。问题是,您将范围的左端点和右端点视为包含边界,但合并算法将它们视为独占边界。您可以通过更改while
循环上的条件来解决此问题:
while (leftIndex <= leftLast && rightIndex <= rightLast) {
if (list[leftIndex].compareTo(list[rightIndex]) < 0) {
mergeList[index] = list[leftIndex];
leftIndex++;
} else {
mergeList[index] = list[rightIndex];
rightIndex++;
}
index++;
}
while (leftIndex <= leftLast) {
mergeList[index] = list[leftIndex];
index++;
leftIndex++;
}
while (rightIndex <= rightLast) {
mergeList[index] = list[rightIndex];
index++;
rightIndex++;
}
while(leftIndex
while (leftIndex <= leftLast && rightIndex <= rightLast) {
if (list[leftIndex].compareTo(list[rightIndex]) < 0) {
mergeList[index] = list[leftIndex];
leftIndex++;
} else {
mergeList[index] = list[rightIndex];
rightIndex++;
}
index++;
}
while (leftIndex <= leftLast) {
mergeList[index] = list[leftIndex];
index++;
leftIndex++;
}
while (rightIndex <= rightLast) {
mergeList[index] = list[rightIndex];
index++;
rightIndex++;
}