有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java插入排序语法问题

我遇到了一种相当奇特的速记法:A[j+1] = A[j--]

这行似乎有两个操作:move A[j] right and decrement j

有没有可能把它分解成单独的步骤来帮助我理解速记

伪代码:

n=A.length
for i <- 1 to n-1
    curr = A[i]
    j = i - 1
    while j >= 0 && A[j] > curr
        A[j+1] = A[j--]
    A[j+1] = curr

source


共 (2) 个答案

  1. # 1 楼答案

    因为在你的例子中,j总是小于A.length

    A[j+1] = A[j ];
    

    int index = j + 1;
    A[index] = A[j];
    j = j - 1;
    

    如以下程序所示:

    import java.util.Arrays;
    
    public class Test {
        public static void main(String[] args) {
    
            int[] A = { 1, 2, 3, 4, 5 };
    
            int j = 2;
            A[j+1] = A[j ];
    
            // prints: [1, 2, 3, 3, 5]
            System.out.println(Arrays.toString(A));
    
        }
    }
    
  2. # 2 楼答案

    当然可以:

    int targetIndex = j + 1;
    int tmp = j;
    j ;
    A[targetIndex] = A[tmp];
    

    注意targetIndex是在任何其他事情发生之前计算的——赋值运算符的左侧实际上是在右侧之前确定的

    然而,递减发生在赋值本身发生之前,甚至在评估右侧数组访问之前。您可以在这个示例代码中看到:

    public class Test {
        public static void main(String[] args) {
            int[] x = { 0, 1, 2, 3, 4 };
            int j = 3;
            try {
                x[j + 1] = x[j  + 10];
            } catch (Exception e) {
                System.out.println("Caught exception");
            }
    
            System.out.println(j); // Prints 2
        }
    }
    

    在这里,您可以看到j已递减,即使赋值本身无法发生

    事实上,如果我们使用x[j + 10] = x[j ];,也会发生同样的情况——换句话说,如果目标索引超出范围。到被发现的时候,减量已经发生了