我不明白为什么它给快速排序程序的数组超出范围的异常?

时间:2019-07-13 20:05:41

标签: java quicksort

我的代码似乎很好,但是为什么它给出了数组超出范围的异常

    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)  

2 个答案:

答案 0 :(得分:0)

错误来自此行:

    while(a[pivot]>=a[l] && l<=u )
        l++;

遍历时,在某个阶段l = 5u = 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);
        }
    }