Io preferisco la versione col while... è più chiara e tale costrutto (il while) è stato inventato apposta per effettuare un ciclo con possibilità di uscita immediata (diversamente dal for che, pur permettendolo, è stato inventato per fare sempre lo stesso numero di cicli).
codice:
public static void insertionSort(int[] arr) {
if (arr.length > 1) {
int i = 0;
int j = 0;
int val = 0;
for(i=1; i<arr.length; i++) {
val = arr[i];
j = i-1;
while((j >= 0) && (arr[j] > val)) {
arr[j+1] = arr[j];
j = j - 1;
arr[j+1] = val;
}
}
}
}
Per quanto riguarda l'istruzione for... questa è la sintassi:
codice:
for(inizializzazione; condizione_di_iterazione; espressione/incremento)
istruzioni
Questo costrutto esegue le istruzioni finchè la condizione_di_iterazione si mantiene vera. Il for può (non è obbligatorio) effettuare un'inizializzazione al primo passo. Solitamente questa inizializzazione riguarda la variabile che controlla il ciclo (che, sempre solitamente, ma non obbligatoriamente, viene anche dichiarata in quel punto), ma non è obbligatorio. Se non viene fatta alcuna inizializzazione, semplicemente la variabile che controlla il ciclo rimane al suo valore attuale. Nota che nell'inizializzazione non è obbligatorio inizializzare la variabile che controlla il ciclo... semplicemente si può eseguire una qualsiasi istruzione.
L'espressione/incremento, solitamente (anche qui, non obbligatoriamente) effettua l'incremento/decremento della variabile che controlla il ciclo.
Nel caso specifico del tuo esempio, la variabile "j" che controlla il ciclo, viene inizializzata fuori dal ciclo for... non essendoci l'inizializzazione, essa non viene toccata e quando il ciclo inizia avrà lo stesso valore che aveva prima del ciclo stesso.
Ciao.