【问题标题】:Array Index Out of Bounds Exception in Java in case of Insertion Sort插入排序时Java中的数组索引越界异常
【发布时间】:2014-09-02 14:54:48
【问题描述】:
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。

怎么办?

【问题讨论】:

  • 试试调试器。它有帮助。
  • 数组访问中的问题0是合法的数组索引。

标签: java insertion-sort


【解决方案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&gt;=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())。

【讨论】:

    【解决方案2】:

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

    Arrays.sort(yourArray);

    【讨论】:

    • 此方法不使用insertion sort,但如documentationDual-Pivot Quicksort中所述。虽然在现实世界中您的回答会很受欢迎,但恐怕 OPs 老师可能不会接受您的解决方案。
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      在您的排序循环中,您初始化 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;
          ....
      

      【讨论】:

        【解决方案5】:

        类插入排序 {

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

        无效插入排序() {

        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[]) {

        插入排序是 = new Insertionsort();

        is.insertionSort();

        }

        }

        【讨论】:

          猜你喜欢
          • 2016-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多