簡體   English   中英

IndexOutOfBoundsException和quicksort算法

[英]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)時會導致超出范圍的異常

問題是minmax

我了解您可以將它們用作發送數組中的索引,但是-您發送的lessgreater原始數組。

因此,以您的示例為例,在第一次調用quicksort ,pivot = 2,這部分quicksort(greater, pivot + 1, max)將發送值3,4的greater值,因此這將為您創建異常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM