插入排序 - 语法问题

时间:2011-02-20 13:52:26

标签: java syntax

我遇到了一个相当特殊的简写符号: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

3 个答案:

答案 0 :(得分: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--];,就会发生同样的情况 - 换句话说,如果它是超出界限的目标索引。到发现时,已经发生了减量。

答案 1 :(得分:2)

由于在您的示例中,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 :(得分:0)

我不知道我是否理解你的问题,但如果你不确定j--符号,请尝试我的例子。显示-j和j--之间的区别 - 它可以在将来帮助你:

public static void main(String[] args) {
    int j = 10;
    System.out.println("Current=" + j);
    System.out.println(j--);
    System.out.println("Current=" + j);
    System.out.println(--j);
    System.out.println("Current=" + j);
}

<强>输出:

Current=10
10
Current=9
8
Current=8