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--)