为什么我们不能在插入sort的while循环中更改语句的顺序?

Jun*_*aid 1 java sorting algorithm insertion-sort

如下所示是学校教授的基本插入排序算法.如果更改while循环参数的顺序,则不起作用.

public static int[] insertionSort(int[] A){
    for(int i =1; i<A.length;i++){
        int key = A[i];
        int j = i;
        while(j>0&&A[j-1]>key){
            A[j]=A[j-1];
            j--;
        }
        A[j]=key;
        }       
    return A;
}
Run Code Online (Sandbox Code Playgroud)

更改后(现在代码不会工作,它将给出java.lang.ArrayIndexOutOfBoundsException:-1 expection):

public static int[] insertionSort(int[] A){
    for(int i =1; i<A.length;i++){
        int key = A[i];
        int j = i;
        while(A[j-1]>key&&j>0){
            A[j]=A[j-1];
            j--;
        }
        A[j]=key;
        }       
    return A;
}
Run Code Online (Sandbox Code Playgroud)

如果有任何其他方法来实现相同的算法,以便条件循环语句的顺序无关紧要?

SLa*_*aks 5

因为短路评估.

如果a的前半部分&&为假,则根本不会评估后半部分(因为结果不可能是真的).
因此,您可以编写j > 0 && A[j - 1]...,并且A[j - 1]只会评估j > 0.