插入排序时Java中的数组索引超出范围异常

时间:2014-09-02 14:54:49

标签: java insertion-sort

class Insertionsort
{

int A[] = {5,2,4,6,1,3};

void insertionSort()
{

    for(int j=2;j<A.length;j++)
    {
    int key = A[j];
    int i = j-1;
        while(i>0 && A[i]>key)
        {
            A[i+1]=A[i];
            i=i-1;
        }
        A[i+1]=key;
    }

    for(int j = 0;j<=A.length;j++)
    {
    System.out.println(A[j]);
    }


}

public static void main(String args[])
{

Insertionsort is = new Insertionsort();

is.insertionSort();

}

}

问题是:

输出为5 1 2 3 4 6而不是1 2 3 4 5 6。

怎么办?

5 个答案:

答案 0 :(得分:1)

这导致错误:

for(int j = 0;j<=A.length;j++)
    System.out.println(A[j]);

数组的最大索引为length - 1,因此请将其更改为:

for(int j = 0;j<A.length;j++)
    System.out.println(A[j]);

更好的是,为什么不使用增强型for?这样你就不会犯这种错误:

for(int a : A)
    System.out.println(a);

返回您的算法:

j=2开始,您省略了第一个元素,因此请将其更改为j=1 你的内部循环应该一直到i>=0否则你也省略了第0个元素(数组索引是从0开始的):

for (int j = 1; j < A.length; j++) {
    int key = A[j];
    int i = j - 1;
    while (i >= 0 && A[i] > key) {
        A[i + 1] = A[i];
        i = i - 1;
    }
    A[i + 1] = key;
}

这将打印1 2 3 4 5 6(自使用println()以来的新行)。

答案 1 :(得分:1)

如果要对数组进行排序,只需使用Arrays类中的Sort()。

Arrays.sort(yourArray);

答案 2 :(得分:0)

for(int j = 0;j<=A.length;j++)

更改为j<A.length以使您的OutOfBounds异常消失。

另外,你的其他循环有错误的开始/结束条件

for(int j=2;j<A.length;j++)应该从j=1开始,while(i>0 && A[i]>key)应该有i>=0,否则数组中的第一个元素将在您的排序中跳过(5)。

答案 3 :(得分:0)

在排序循环中,初始化j = 2然后从int key = A[j];数组中获取一个数字,因此您尝试排序的数组中的第一个数字是索引2.因为数组中的第一个元素索引为0,排序时省略5和2。将循环更改为

for(int j = 0; j < A.length(); j++){
    int key = A[j];
    int i = j-1;
    ....

答案 4 :(得分:-1)

类Insertionsort {

int A [] = {5,2,4,6,1,3};

void insertionSort() {

for(int j=1;j<A.length;j++)
{
int key = A[j];
int i = j-1;
    while(i>=0 && A[i]>key)
    {
        A[i+1]=A[i];
        i=i-1;
    }
    A[i+1]=key;
}

for(int j = 0;j<A.length;j++)
{
System.out.print(A[j] + " ");
}

}

public static void main(String args []) {

Insertionsort = = new Insertionsort();

is.insertionSort();

}

}

相关问题