我的代码似乎很好,但是为什么它给出了数组超出范围的异常
import java.util.*;
import java.io.*;
class Qsort
{
static int partition(int a[],int l,int h)
{
int pivot=l;
int u=h;
while(l<=h)
{
while(a[pivot]>=a[l] && l<=u )
l++;
while(a[pivot]<a[h])
h--;
if(l<=h)
{
int temp=a[l];
a[l]=a[h];
a[h]=a[l];
}
}
int t=a[pivot];
a[pivot]=a[h];
a[h]=t;
return h;
}
static void qs(int a[],int l,int h)
{
if(l<h)
{
int v=partition(a,l,h);
qs(a,l,v-1);
qs(a,v+1,h);
}
}
}
class Qsmain
{
public static void main (String ars[]) throws IOException
{
int a[]= {10, 7, 8, 9, 1, 5};
int n=6;
Qsort.qs(a,0,n-1);
System.out.println("The Sorted array is - ");
for(int i=0;i<n;i++)
System.out.print(a[i]+" ");
}
}
如下所示的异常:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 6
at Qsort.partition(Qsmain.java:16)
at Qsort.qs(Qsmain.java:36)
at Qsmain.main(Qsmain.java:61)
答案 0 :(得分:0)
错误来自此行:
while(a[pivot]>=a[l] && l<=u )
l++;
遍历时,在某个阶段l = 5
和u = 5
中,l++ = 6
会抛出异常,因为a[6]
越界(最后一个成员是{ {1}})。因此,要解决此问题,请将语句更改为:
a[5]
但这将导致下一个错误,因为 while(a[pivot]>=a[l] && l<u ) //instead of l<=u, write l<u
将转换为while(l<=h)
,然后将永远运行,因为l的最后一个值为5,并且不会递增。我将由您自己决定如何解决该问题。
答案 1 :(得分:0)
该代码似乎是Hoare分区方案的变体。以下是基本Hoare分区方案的简单示例。两端的扫描都不需要检查是否超出范围,因为左扫描将始终遇到> =枢轴值,右扫描将始终遇到<=枢轴值。在分区步骤中,等于枢轴的元素或枢轴本身可以终止于分区中的任何位置,索引 hh 只是左分区(元素<=枢轴)和右分区之间的边界(元素> =枢轴),因此a [hh]处的元素需要包含在一个递归调用中(在此示例中,这是第一个递归调用)。
public static void qsort(int[] a, int lo, int hi)
{
if(lo < hi){
int ll = lo-1;
int hh = hi+1;
int p = a[lo+(hi-lo)/2];
int t;
while(true){
while(a[++ll] < p);
while(a[--hh] > p);
if(ll >= hh)
break;
t = a[ll];
a[ll] = a[hh];
a[hh] = t;
}
ll = hh++;
qsort(a, lo, ll);
qsort(a, hh, hi);
}
}