сортировка вставок - вопрос синтаксиса - PullRequest
0 голосов
/ 20 февраля 2011

Я наткнулся на довольно своеобразную стенограмму: 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

источник

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

Так как в вашем примере 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 голосов
/ 20 февраля 2011

Sure:

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--]; - другими словами, если это индекс target , который выходит за пределы. К тому времени, когда это обнаружено, снижение уже произошло.

0 голосов
/ 20 февраля 2011

Я не знаю, хорошо ли я понял вашу проблему, но если вы не уверены, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...