首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速排序-线程"main“java.lang.ArrayIndexOutOfBoundsException中出现异常:-1

快速排序-线程"main“java.lang.ArrayIndexOutOfBoundsException中出现异常:-1
EN

Stack Overflow用户
提问于 2018-11-05 10:50:42
回答 2查看 64关注 0票数 1

为了学习编程,我将在2019年初参加一个新兵训练营,并希望为此做好准备。我有一本Java书,里面有下面的代码作为快速排序算法的例子,我直接从书中复制了它,它给我提供了IndexOutOfBounds错误。我知道这与正在检查但可能不存在的索引的位置有关,但是,我不能明确地说出哪里出了问题。有什么帮助吗?提前谢谢。

代码语言:javascript
复制
// Try This 6-3: A simple version of the Quicksort. 

class Quicksort {

    // Set up a call to the actual Quicksort method.
    static void qsort(char items[]) {
        qs(items, 0, items.length-1);
    }

    // A recursive version of Quicksort for characters. 
    private static void qs(char items[], int left, int right)
    {
        int i, j;
        char x, y;

        i = left; j = right;
        x = items[(left+right)/2];

        do {
            while((items[i] < x) && (i < right))
                i++;

            while((x < items[j]) && (j > left))
                j--;

            if(i <= j) {
                y = items[i];
                items[i] = items[j];
                items[j] = y;

                i++; 
                j--;
            }
        } while(i <= j);

        if(left < j);
            qs(items, left, j);

        if(i < right)
            qs(items, i, right);
    }
}

class QSDemo { 
    public static void main(String args[]) {
        char a[] = {'d', 'x', 'a', 'r', 'p', 'j', 'i'};
        int i; 

        System.out.println("Original array: ");

        for(i = 0; i < a.length; i++)
            System.out.print(a[i]);

        System.out.println();

        // now, sort the array
        Quicksort.qsort(a);

        System.out.print("Sorted array: ");

        for(i = 0; i < a.length; i++)
            System.out.print(a[i]);
    }
}*emphasized text*
EN

回答 2

Stack Overflow用户

发布于 2018-11-05 12:16:23

问题是你在if语句后面放了一个;,这就是你得到这个错误的原因。由于;,无论if条件如何,qs()都将被调用。

代码语言:javascript
复制
    if(left < j); qs(items, left, j); //<------problem
    ____________^

if(left < j); qs(items, left, j);应为if(left < j) qs(items, left, j);

票数 1
EN

Stack Overflow用户

发布于 2018-11-05 13:02:07

检查qs()函数中的第二个if循环,它检查left是否小于j。您在if语句后添加了分号(可能是意外的)。这会导致无论if条件是否通过,都会执行本应位于if循环内的语句。

它应该是这样的:

代码语言:javascript
复制
if(left < j)             //remove semi-colon which was here
    qs(items, left, j);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53147698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档