java - 为什么我们不能改变插入排序的 while 循环中语句的顺序?

标签 java algorithm sorting 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;
}

更改后(现在代码将无法运行,它会给出 java.lang.ArrayIndexOutOfBoundsException: -1 预期):

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;
}

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

最佳答案

由于短路评估。

如果 && 的前半部分为假,则根本不会计算后半部分(因为结果不可能为真)。
因此,您可以编写 j > 0 && A[j - 1]...,并且 A[j - 1] 将仅在 j > 时被计算0

关于java - 为什么我们不能改变插入排序的 while 循环中语句的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24073503/

相关文章:

c++ - C++中字符串 vector 的排序 vector

java - utf8(阿拉伯语)字符串显示为问号(?)

java - Home 与组件接口(interface) EJB

java - 有和没有分配给变量的未经检查的强制转换行为

algorithm - 如何将三角形的缠绕更正为 3D 网格模型的逆时针方向?

c++ - 得到有很大差异的均值和删除数字

java - Properties.store() - 抑制时间戳注释

java - 任意精度乘法,Knuth 4.3.1 前导零消除

python - 以特定方式对文件进行排序

perl - Perl 排序的单元测试