Почему мы не можем изменить порядок операторов в цикле вставки сортировки while?

1

Как показано ниже, основной алгоритм сортировки вставки используется в школе. если вы измените порядок параметров цикла 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 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;
}

Если есть какой-либо другой способ реализовать тот же алгоритм, чтобы порядок операторов условных циклов не имел значения?

  • 0
    Почему заказ имеет значение для вас?
  • 0
    Имеет значение, когда вы пишете это самостоятельно, не глядя на онлайн-решение. Тогда вам всегда нужно будет учитывать «эффект порядка» в вашем коде.
Показать ещё 1 комментарий
Теги:
algorithm
sorting
insertion-sort

1 ответ

5
Лучший ответ

Из-за короткого замыкания.

Если первая половина && ложна, вторая половина не будет вообще оценена (поскольку результат не может быть правдой).
Поэтому вы можете написать j > 0 && A[j - 1]..., а A[j - 1] будет оцениваться только при j > 0.

  • 0
    Спасибо за ваш ответ. Я вроде понял это, но мне нужен еще один алгоритм для реализации той же логики с той же временной сложностью.
  • 0
    @Junaid Он ответил на вопрос, который вы задали в заголовке.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню