![](/img/trans.png)
[英]Java IndexOutOfBoundsException in MergeSort algorithm
[英]IndexOutOfBoundsException and quicksort algorithm
我在弄清楚為什么我的代碼具有IndexOutOfBoundsException
時遇到了麻煩。 我想知道是否有人可以幫我解決這個錯誤。 我正在手工嘗試,但是我認為在遍歷代碼時缺少一些東西。
碼:
package Algorithms;
import java.util.ArrayList;
public class quickSort {
public static ArrayList<Integer> mergeArrayList(ArrayList<Integer> min, int pivot, ArrayList<Integer> max) {
ArrayList<Integer> mergedList = new ArrayList<Integer>();
//mergedList.addAll(min);
for (int i : min) {
mergedList.add(i);
}
mergedList.add(pivot);
//mergedList.addAll(max);
for (int j : max) {
mergedList.add(j);
}
return mergedList;
}
public static ArrayList<Integer> quicksort(ArrayList<Integer> array, int min, int max) {
if (array.size() <= 1) {
return array;
}
int pivot = (min + max)/2;
ArrayList<Integer> less = new ArrayList<Integer>();
ArrayList<Integer> greater = new ArrayList<Integer>();
for (int i : array) {
if (i <= array.get(pivot)) {
less.add(i);
}
else {
greater.add(i);
}
}
return mergeArrayList(quicksort(less,min,pivot - 1), array.get(pivot), quicksort(greater, pivot + 1, max));
}
public static void main(String[] args) {
ArrayList<Integer> arr1 = new ArrayList<Integer>();
int[] arr = {1,2,3,4,5};
for (int i : arr) {
arr1.add(i);
}
System.out.println(quicksort(arr1,0,arr1.size() - 1));
}
}
錯誤:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 2
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at Algorithms.quickSort.quicksort(quickSort.java:30)
at Algorithms.quickSort.quicksort(quickSort.java:37)
at Algorithms.quickSort.main(quickSort.java:46)
在quicksort
方法的開頭添加此行以用於調試。
public static ArrayList<Integer> quicksort(ArrayList<Integer> array, int min, int max)
{
System.out.println(Arrays.toString(array.toArray()) + " -> " + min + " " + max);
...
}
您將確切地了解正在發生的情況以及何時何地出錯。
快速排序中的quicksort(greater,pivot + 1,max)將導致:
int pivot = (max + pivot + 1) /2; //pseudocode
透視將大於數組的長度(是原始長度的一半),當您請求array.get(pivot)時會導致超出范圍的異常
問題是min
和max
我了解您可以將它們用作發送數組中的索引,但是-您發送的less
和greater
原始數組。
因此,以您的示例為例,在第一次調用quicksort
,pivot = 2,這部分quicksort(greater, pivot + 1, max)
將發送值3,4的greater
值,因此這將為您創建異常
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.