Java 为什么这个插入排序方法给了我错误的输出?

Java 为什么这个插入排序方法给了我错误的输出?,java,insertion-sort,Java,Insertion Sort,为什么这种插入排序给了我错误的答案,而当我按照注释行指定的方式进行插入时却得到了正确的答案?区别是什么 public class Solution { public static void main(String[] args) { Scanner s=new Scanner(System.in); int i,j,n,sk=0; //consider another variable k int a[]=new int[20];

为什么这种插入排序给了我错误的答案,而当我按照注释行指定的方式进行插入时却得到了正确的答案?区别是什么

    public class Solution
    {

    public static void main(String[] args) 
    {

    Scanner s=new Scanner(System.in);
    int i,j,n,sk=0; //consider another variable k
    int a[]=new int[20];
    n=s.nextInt();
    for(i=0;i<n;i++)
        a[i]=s.nextInt();
    for(i=1;i<n;i++)
    {   j=i-1;
        //adding k=a[i]
    while((j>=0)&&a[j]>a[i]) //a[j]>k instead of the condition a[j]>a[i]
    {   sk++;
        a[j+1]=a[j];
        j--;
    }
       a[j+1]=a[i];
       //a[j+1]=k instead of the previous line.       
    }
    for(i=0;i<n;i++)
    System.out.println(a[i]);
    }
    }
公共类解决方案
{
公共静态void main(字符串[]args)
{
扫描仪s=新的扫描仪(System.in);
int i,j,n,sk=0;//考虑另一个变量k
int a[]=新int[20];
n=s.nextInt();
对于(i=0;ia[i])//a[j]>k而不是条件a[j]>a[i]
{sk++;
a[j+1]=a[j];
j--;
}
a[j+1]=a[i];
//a[j+1]=k,而不是前一行。
}

对于(i=0;i这条线a[j+1]=a[j]

当i=1,j=0时,考虑数组={5,2,3}

 while((j>=0)&&a[j]>a[i]) //a[j]>k instead of the condition a[j]>a[i]
        {   sk++;
        a[j+1]=a[j];   // a[1] = a[0]
            j--;   // j becomes -1 out of the loop 
        }
  // Array becomes {5,5,3} after while loop, we lost 2 
           a[j+1]=a[i];   // again  a[0] is just getting initialized to a[1] 
                                           //which are same
           //a[j+1]=k instead of the previous line.  **// K will have previous 
                                              a[1]**      
        }

在执行[j+1]=a[j]时,您已经更新了[1],然后在while循环外再次分配[1]=a[1],但是,k将存储以前的a[1]值,而不是更新后的值。此行a[j+1]=a[j]

当i=1,j=0时,考虑数组={5,2,3}

 while((j>=0)&&a[j]>a[i]) //a[j]>k instead of the condition a[j]>a[i]
        {   sk++;
        a[j+1]=a[j];   // a[1] = a[0]
            j--;   // j becomes -1 out of the loop 
        }
  // Array becomes {5,5,3} after while loop, we lost 2 
           a[j+1]=a[i];   // again  a[0] is just getting initialized to a[1] 
                                           //which are same
           //a[j+1]=k instead of the previous line.  **// K will have previous 
                                              a[1]**      
        }

当您执行[j+1]=a[j]时,您已经更新了[1],然后在while循环外再次分配[1]=a[1],但是,k将存储以前的a[1]值,而不是更新后的值。为了简单起见,在您的解决方案中,您是通过引用编辑变量,而正确的解决方案是通过值传递它们

通过引用传递变量时,编辑一个值与编辑第二个值相同

下面是一个简单的代码,可以帮助您理解:

public class Main {
    public static void main(String[] args) {
        Foo foo = new Foo();

        int valueToAdd = 5;
        // foo.a will not be modified because we set the parameter by value
        editTestByValue(foo.a, valueToAdd);
        System.out.println(foo.a); // prints 1


        editTestByReference(foo, valueToAdd);
        // foo.a will be modified because we set the parameter by reference
        System.out.println(foo.a); // prints 6
    }

    public static void editTestByValue(int a, int valueToAdd){
        a += valueToAdd;
    }

    public static void editTestByReference(Foo foo, int valueToAdd){
        foo.a += valueToAdd;
    }
}

class Foo {
     public int a = 1;
}
通过使用数组而不是类来使用相同的东西

有关更多信息,请查看此项


希望能有所帮助!

为了简单起见,在您的解决方案中,您通过引用编辑变量,而正确的解决方案是通过值传递变量

通过引用传递变量时,编辑一个值与编辑第二个值相同

下面是一个简单的代码,可以帮助您理解:

public class Main {
    public static void main(String[] args) {
        Foo foo = new Foo();

        int valueToAdd = 5;
        // foo.a will not be modified because we set the parameter by value
        editTestByValue(foo.a, valueToAdd);
        System.out.println(foo.a); // prints 1


        editTestByReference(foo, valueToAdd);
        // foo.a will be modified because we set the parameter by reference
        System.out.println(foo.a); // prints 6
    }

    public static void editTestByValue(int a, int valueToAdd){
        a += valueToAdd;
    }

    public static void editTestByReference(Foo foo, int valueToAdd){
        foo.a += valueToAdd;
    }
}

class Foo {
     public int a = 1;
}
通过使用数组而不是类来使用相同的东西

有关更多信息,请查看此项


希望有帮助!

请发布错误和正确答案输出。请发布错误和正确答案输出。