我正在尝试使用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.]
我是编程的新手,所以任何有关我出错的地方的建议都会受到赞赏。
编辑:添加了整个堆栈跟踪
答案 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];
a
是swap
的第一个参数。第20行对swap
的调用是
swap(a,right,randPivot);
因此right
在此时为-1。此值来自此处(第13行):
randSort(a,left,pivot-1);
如果此时pivot
为0,则会发生错误。它可以变为0,因为它被视为left
和right
之间的随机值。 (实际上,这是一个错误,就有效分区而言,pivot
应落在 left
和right
之间,非包含。)目前,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()函数中,我猜这是正确的去负面。抱怨所有的噪音。