Como funciona o Insertion Sort?
É uma técnica de ordenação muito simples, você divide o array em 2 partes:
-> A parte à esquerda do índice, essa parte está sempre ordenada
-> Do índice pra frente ainda não está.
Você vai correr todos os índices do array, um a um, e em cada um deles, vai trocar seu valor com todos os números à esquerda dele que são maiores. Exemplo:
Temos o array
int[] array = new int[]{5, 7, 1, 9};
Vamos aplicar a regra, o índice
i começa no 0.
Não existe nenhum número maior do que ele à esquerda de
i portanto ele não precisa ser avaliado mais, vamos para o próximo.
Comparamos com todos os itens à esquerda dele, um a um. No caso o primeiro valor é o
5, que é menor que ele, então trocamos eles de lugar.
Não tem nenhum número maior do que ele à esquerda, então avançamos o índice
Comparamos com todos os itens à esquerda dele, um a um. No caso o primeiro valor é o
7, que é menor que ele, então trocamos eles de lugar.
Continuamos a avaliação, o próximo valor à sua esquerda é o
5 portanto trocamos novamente
Não tem nenhum número maior do que ele à esquerda, então avançamos o índice
o valor que está no índice agora já está ordenado, o valor à esquerda dele é menor, portanto paramos a avaliação aqui.
Nos paramos de avaliar os valores de cada índice em 2 casos:
1 - Passamos começo do array (j é menor do que 0)
2 - O valor imediatamente a esquerda, é menor do que o valor sendo comparado(array[j -1] é menor do que array[j])
Implementando isso em Java, nós temos o laço que você apresentou. O segundo argumento do laço for recebe uma condição booleana que diz se o laço ainda deve ser executado, caso a avaliação da expressão retorne true o bloco de código é executado, caso retorne false, não.
A expressão pode ser a que você quiser, contanto que retorne um valor booleano, então você pode invocar diversos métodos, fazer comparações, o que quiser.
Caso seja mais simples pra você no começo, pode aplicar a segunda comparação de parada dentro do laço, assim:
for (int j = i - 1; j >= 0 ; j--){
if(array[j] > a){
array[j + 1] = array[j];
array[j] = a;
}else{
break;
}
}
Espero que a explicação te ajude de alguma forma :)