【问题标题】:Quicksort - Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1快速排序 - 线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:-1
【发布时间】:2018-11-05 02:50:41
【问题描述】:

学习编码,我将参加 2019 年初的新兵训练营,并为之做好准备。我有一本 Java 书籍,其中包含以下代码作为快速排序算法的示例,我直接从书中复制了它,它为我提供了 IndexOutOfBounds 错误。我知道这与正在检查但可能不存在的索引位置有关,但是,我无法具体说明问题所在。有什么帮助吗?提前致谢。

// 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*

【问题讨论】:

  • 这和javascript有什么关系?
  • Java !== JavaScript
  • @ThomasCatinella 另一个用户已经更正了标签,你刚刚又把它们弄错了。编写代码的语言是 java 而不是 javascript

标签: java arrays algorithm quicksort


【解决方案1】:

问题是您在if 语句之后添加了;,这就是您收到错误的原因。由于 ; ,无论 if 条件如何,都会调用 qs()

    if(left < j); qs(items, left, j); //<------problem
    ____________^

if(left &lt; j); qs(items, left, j); 应该是if(left &lt; j) qs(items, left, j);

【讨论】:

  • 我觉得自己又傻又瞎!我到处找。谢谢你的眼睛!
  • @ThomasCatinella 没问题!如果您没有更多问题,请关闭问题。
  • 新加入堆栈。我看不到在哪里/如何结束这个问题。我也删不掉。
  • @ThomasCatinella close 意味着如果我的回答帮助您解决了问题,只需单击右键。你不需要删除它。
【解决方案2】:

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

应该是这样的:

if(left < j)             //remove semi-colon which was here
    qs(items, left, j);

【讨论】:

  • 我觉得自己又傻又瞎!我到处找。谢谢你的眼睛!
  • 所有@ThomasCatinella 有时都会发生这种情况。没有汗水。
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2012-01-13
  • 2011-09-09
相关资源
最近更新 更多