QuickSort实现中的ArrayIndexOutofBoundsException

时间:2012-04-03 07:20:08

标签: java algorithm debugging quicksort

我正在尝试使用QuickSort但是获得了

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at com.JavaReference.QuickSort.swap(QuickSort.java:50)
at com.JavaReference.QuickSort.randPartition(QuickSort.java:20)
at com.JavaReference.QuickSort.randSort(QuickSort.java:12)
at com.JavaReference.QuickSort.randSort(QuickSort.java:13)
at com.JavaReference.QuickSort.randSort(QuickSort.java:13)
at com.JavaReference.QuickSort.randSort(QuickSort.java:13)
at com.JavaReference.QuickSort.randSort(QuickSort.java:13)
at com.JavaReference.QuickSort.randSort(QuickSort.java:8)
at com.JavaReference.QuickSort.main(QuickSort.java:59)

这是我的源代码[here.]

我是编程的新手,所以任何有关我出错的地方的建议都会受到赞赏。

编辑:添加了整个堆栈跟踪

6 个答案:

答案 0 :(得分:1)

我的嫌疑人是第30行:

            int i =left-1;

由于left最初为0,i将变为-1。然后在第35行,你打电话

                            swap(a,i,j);

and bang。

好的,从堆栈跟踪看起来我的第一个猜测是错误的。

第二个猜测:从堆栈跟踪中,它显示数组被分区4次,然后在第5次尝试时异常到来。它出现在第50行:

int temp= array[a];

aswap的第一个参数。第20行对swap的调用是

swap(a,right,randPivot);

因此right在此时为-1。此值来自此处(第13行):

randSort(a,left,pivot-1);

如果此时pivot为0,则会发生错误。它可以变为0,因为它被视为leftright之间的随机值。 (实际上,这是一个错误,就有效分区而言,pivot应落在 leftright之间,非包含。)目前,pivot的概率{随着最左边的分区变小,{1}}变为0。您需要对此进行检查(或者,更一般地,检测大小为1的数组分区,不能进一步分区),以便及时停止递归。

答案 1 :(得分:1)

java.lang.ArrayIndexOutOfBoundsException:-1总是告诉您正在尝试在此数组中不存在的索引处调用数组。 这里a的值(尝试做System.out.println(a)将显示a的值)成为执行-1的一次。 因此,您尝试调用导致异常的数组[-1],因为数组的索引为0。 你需要改变你的算法,这样你的方法交换只能用值int []数组调用,值介于0和array.length-1之间,值介于0和array.length之间

答案 2 :(得分:0)

您正尝试访问索引为-1的数组元素。这总是抛出异常。检查索引(a> = 0)。

答案 3 :(得分:0)

只是一个提示。这个功能:

public static void randSort(int a[],int left,int right)

导致无限递归(它将永远称自己)。在某些时候,您将使用参数left = 0和right = -1调用swap(因为randPartition在某个时刻返回0)。

答案 4 :(得分:0)

我认为允许枢轴为是没有意义的。这是因为 pivot 应该用于分隔要分类的两个部分(分而治之)。为了最有效,两个部分的大小应该相等。

因此,如果仅相差1,那么无论如何都应该结束递归。

答案 5 :(得分:0)

好伙计们, 这是我早些时候的不好,我错过了一个关键的

 \\\Other code 
 if(left<right){
    int pivot=randPartition(a,left,right);// testing purposes

    randSort(a,left,pivot-1);........
 ...

在randSort()函数中,我猜这是正确的去负面。抱怨所有的噪音。