Как показано ниже, основной алгоритм сортировки вставки используется в школе. если вы измените порядок параметров цикла 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;
}
Если есть какой-либо другой способ реализовать тот же алгоритм, чтобы порядок операторов условных циклов не имел значения?
Из-за короткого замыкания.
Если первая половина &&
ложна, вторая половина не будет вообще оценена (поскольку результат не может быть правдой).
Поэтому вы можете написать j > 0 && A[j - 1]...
, а A[j - 1]
будет оцениваться только при j > 0
.