超出数组的范围[使用ArrayList进行冒泡选择]

时间:2014-01-10 09:04:31

标签: java sorting arraylist indexoutofboundsexception

我正在编写一个冒泡选择方法,它应该使用这些凭据:

/* Write code for a Bubble Sort algorithm that starts at the right side of
 * of ArrayList of Comparable objects and "bubbles" the largest item to the
 * left of the list.  The result should be an ArrayList arranged in descending
 * order.
 */
 @SuppressWarnings("unchecked") 
 void bubbleSort(ArrayList <Comparable> list) {

    int end = list.size();

    for (int i = 0 ; i < end; i++){
        for (int j = end; j > 0; j--){
            if ( list.get(j).compareTo(list.get(j-1)) > 0 ){
                //swap
                Comparable temp = list.get(j);
                list.set(j,list.get(j - 1));
                list.set(j - 1, temp);
                //System.out.println(list);
            }
        }   
        end--;
    }
}

问题是,Java会告诉我它已经超出界限。

如果我改为使用

for (int j = end - 1; j > 0; j--)

然后代码将运行,但它不会运行列表运行所需的次数以完全完成排序(也就是说它会停止一个循环)

4 个答案:

答案 0 :(得分:1)

如上所述,您需要从end-1开始,否则您将访问超出数组的范围。


假设你有一个整数数组:5 1 4

您的算法将执行此操作:

第一次迭代 - &gt; i = 0 / j从2开始

1 5 4

第二次迭代 - &gt; i = 1 / j从1开始

现在只比较5和1而不切换它们,因为5更高。那么,4和5?他们应该互换。你的算法实现是错误的。

如果删除end--;,它应该有效。 但是,这可以进行优化

答案 1 :(得分:0)

使用此代码,它可以满足您在数组实现中的要求,其中 size 是您的数组长度。

for (int i = 0; i < size - 1; j++) {
    for (int j = i + 1; j < size - 1; k++){
        if (array[i] > array[j]) {
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp; 
        }   
    }
}

答案 2 :(得分:0)

如果数组长3,则数组[3]超出范围。 由于你从数组[lenght]开始,你必须在进入for循环之前减少它,就像你提供的代码一样。

答案 3 :(得分:0)

使用end - 1将比较列表中的最后和倒数第二个值 如果您使用end,它会尝试比较最后一个值的最后一个值和值,这将给出ArrayOutOfBound Exception

现在要获得正确的输出,您必须按照以下所示删除end--;

for (int i = 0 ; i < end; i++){
        for (int j = end -1; j > 0; j--){
            if ( list.get(j).compareTo(list.get(j-1)) > 0 ){
                //swap
                Comparable temp = list.get(j);
                list.set(j,list.get(j - 1));
                list.set(j - 1, temp);
            }
        } 
        //remove below line
        end--;
    }

这也会使列表从右侧缩短一个值。所以删除这将工作