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.i
7, 5, 1, 9 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.
OK
i
7, 5, 1, 9Comparamos 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.OK
i
5, 7, 1, 9Não tem nenhum número maior do que ele à esquerda, então avançamos o índice
OK OK
i
5, 7, 1, 9Comparamos 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.OK OK
i
5, 1, 7, 9Continuamos a avaliação, o próximo valor à sua esquerda é o 5 portanto trocamos novamenteOK OK
i
1, 5, 7, 9Não tem nenhum número maior do que ele à esquerda, então avançamos o índiceOK OK OK
i
1, 5, 7, 9o valor que está no índice agora já está ordenado, o valor à esquerda dele é menor, portanto paramos a avaliação aqui.[code]OK OK OK OK
1, 5, 7, 9[/code]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 