Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行自定义版本的插入排序时出现数组越界异常_Java_Arrays_Sorting - Fatal编程技术网

Java 执行自定义版本的插入排序时出现数组越界异常

Java 执行自定义版本的插入排序时出现数组越界异常,java,arrays,sorting,Java,Arrays,Sorting,我试图解决这个问题(不是确切的插入排序),并编写了以下代码: import java.util.*; public class Solution { static void insertionSort(int[] ar,int n) { int key=ar[n]; int temp; int j=1; for(int i=0;i<ar.length;i++){ j++;

我试图解决这个问题(不是确切的插入排序),并编写了以下代码:

import java.util.*;
public class Solution {

    static void insertionSort(int[] ar,int n) {
        int key=ar[n];
        int temp;
        int j=1;
        for(int i=0;i<ar.length;i++){
              j++;
        }

        for(int i=j-1;i>=0;i--){
            temp=ar[i];
            if(temp>key)
            {
                ar[i+1]=temp;
                printArray(ar);
            }
            else{
                ar[i+1]=key;
                printArray(ar);
            }
        }
    }   

/* Tail starts here */

    static void printArray(int[] ar) {
        for(int n: ar){
            System.out.print(n+" ");
        }
        System.out.println("");
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] ar = new int[n];
        for(int i=0;i<n;i++){
            ar[i]=in.nextInt(); 
        }
       insertionSort(ar,n);
    }    
}
import java.util.*;
公共类解决方案{
静态void insertionSort(int[]ar,int n){
int key=ar[n];
内部温度;
int j=1;
对于(int i=0;i=0;i--){
温度=ar[i];
如果(温度>键)
{
ar[i+1]=温度;
打印阵列(ar);
}
否则{
ar[i+1]=键;
打印阵列(ar);
}
}
}   
/*尾巴从这里开始*/
静态void打印数组(int[]ar){
for(int n:ar){
系统输出打印(n+“”);
}
System.out.println(“”);
}
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
int n=in.nextInt();
int[]ar=新的int[n];

对于(inti=0;i,正如Brian指出的,第一行行不通,因为

int key=ar[n];
n
ar.length
(这使得它在这种情况下也是多余的)


使用调试器会向您显示错误,但我怀疑问题就在这里

ar[i+1]=temp;
我假设
i
是最后一个有效的引用

顺便说一句


同样,这会使
j
j-1
太大,无法在数组中进行索引。

首先,您能否将变量命名为“i”、“j”和“n”以外的名称? 一旦你做到了这一点,在你的代码中使用一致的风格(你去掉了一些大括号而不是其他的?)

然后,…一旦您可以轻松地阅读代码,使用调试器,并找出您将使用哪一行。您可能会发现这很有用:

这是第49行。也就是说,此时,您尝试访问数组中不存在的位置。您的数组当前的大小为“n”(请正确命名!)。您正在尝试在此处获取位置n:

int key=ar[n];
数组从0到n-1。例如,如果n是5,则有ar[0]、ar[1]、ar[2]、ar[3]和ar[4。这是5个位置,因此ar[5](或ar[n])不存在。

我发现答案如下

 /* Head ends here */
 import java.util.*;
 public class Solution {

      static void insertionSort(int[] ar,int n) {

          int key=ar[n-1];
          int temp;
          int inserted=0;
          for(int i=ar.length-2;i>-1;i--){
              temp=ar[i];
              if(temp>key)
              {
                  ar[i+1]=temp;
                  printArray(ar);
              }
              else {
                  ar[i+1]=key;
                  inserted=1;
                  break;

              }

          }

          if(inserted==0){
          ar[0]=key;
          }

          printArray(ar);
   }   

   /* Tail starts here */

  static void printArray(int[] ar) {
     for(int n: ar){
        System.out.print(n+" ");
     }
       System.out.println("");
  }

  public static void main(String[] args) {
       Scanner in = new Scanner(System.in);
       int n = in.nextInt();
       int[] ar = new int[n];
       for(int i=0;i<n;i++){
          ar[i]=in.nextInt(); 
       }
       insertionSort(ar,n);
   }    
 }
/*此处为前端*/
导入java.util.*;
公共类解决方案{
静态void insertionSort(int[]ar,int n){
int key=ar[n-1];
内部温度;
插入的int=0;
对于(int i=ar.length-2;i>-1;i--){
温度=ar[i];
如果(温度>键)
{
ar[i+1]=温度;
打印阵列(ar);
}
否则{
ar[i+1]=键;
插入=1;
打破
}
}
如果(插入==0){
ar[0]=键;
}
打印阵列(ar);
}   
/*尾巴从这里开始*/
静态void打印数组(int[]ar){
for(int n:ar){
系统输出打印(n+“”);
}
System.out.println(“”);
}
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
int n=in.nextInt();
int[]ar=新的int[n];

对于(int i=0;iArrayIndexOutofBound,当您尝试访问不存在的位置时,会发生上述异常

您已将insertSort()函数传递给数组大小。我认为您不需要j变量

通过您的实施:

j=ar.长度+1=n+1

例如:

n = 5

ar =  3, 6, 2, 7, 3
      ^  ^  ^  ^  ^
index:0, 1, 2, 3, 4

j = n+1 = 6
当从i=j-1循环数组时

temp=ar[i];                     -> ar[5]
ar[i+1]=key; or ar[i+1]=temp;   -> ar[6]
您试图访问上面的两个位置都是非法的-因此出现错误

您的for循环应该类似于:

for(int i=n-2; i>=0; i--)

他这样做的那个:
int key=ar[n]
对于OP,几乎所有编程语言中的数组都是零基的。错误告诉您正在尝试访问数组中的第6个元素,而该数组的长度只有5。如果使用调试器,您将很快找到它……一旦修复了它,您仍然会在第二个
for
循环中离开数组的末尾在
insertionSort
@BrianRoach:你是说我应该把n-1作为键吗?@BrianRoach:这有什么区别吗啊,它一下子就崩溃了。他把
n
传了进去,然后试图访问
ar[n]
虽然我完全同意,但清理样式问题很难解决问题,在这一点上也不是很有建设性。我同意@Bex,但你提到的都是好的,不用担心,我给出的是一个UpvoteInterest,但其背后的理由是,如果代码整洁,并且它们使用调试器,它们将被终止d自己更容易找到问题。然后我指出问题所在,我希望OP能从那里开始工作。我想从技术上讲,这并不是说如何解决问题,而是说问题是什么和在哪里。然而,在我看来,这像是一项任务,我认为说这是你解决问题的方式对任何人都没有帮助这是密码。我也同意Peter Lawrey的回答,它解释了问题。谢谢你的回答,但我已经找到了答案,我投你一票
temp=ar[i];                     -> ar[5]
ar[i+1]=key; or ar[i+1]=temp;   -> ar[6]
for(int i=n-2; i>=0; i--)