Usando for pra organizar vetor com Bubble Sort

Pra que usar dois for um dentro do outro para organizar vetor com Bubble Sort?

  1. Pegue uma folha de papel;
  2. Escreva uns 5 números, um ao lado do outro, digamos 7, 4, 8, 1, 3.
  3. Pense num algoritmo para colocá-los em ordem, comparando os valores;
  4. Fique atento ao que você está pensando e tente generalizar o processo;
  5. Se você conseguir, você vai chegar em um desses três algoritmos: Selection sort, Insertion sort ou Bubble sort. Os três são algoritmos simples, não muito eficientes, mas que resolvem esse problema;
  6. Ao fazer esse exercício mental, você mesmo deverá ser capaz de explicar o motivo de precisar de dois fors para resolver esse problema.

Ok.

É por que ele vai comparar todos valores em dois em dois até que esteja ordenado em ordem crescente cinco vezes?

A cada passada é garantido que o maior elemento estará no final ou o menor no início, dependendo de como vc está implementando.

Dessa forma, depois da primeira passada do for mais externo, 8 vai estar na última posição:

int[] array = { 7, 4, 8, 1, 3 };

for ( int i = 0; i < array.length; i++ ) {
    for ( int j = 0; j < array.length - i - 1; j++ ) {
        if ( array[j] > array[j+1] ) {
            int t = array[j];
            array[j] = array[j+1];
            array[j+1] = t;
        }
    }
}

E dessa forma, depois da primeira passada do for mais externo, 1 vai estar na primeira posição:

int[] array = { 7, 4, 8, 1, 3 };

for ( int i = 0; i < array.length; i++ ) {
    for ( int j = array.length - 1; j > i; j-- ) {
        if ( array[j] < array[j-1] ) {
            int t = array[j];
            array[j] = array[j-1];
            array[j-1] = t;
        }
    }
}

Há várias outras formas de implementar o bubble sort, todas variações dessas que passei. Você pode inclusive parar o for mais externo se não houver nenhuma troca no for mais interno:

boolean trocou;
int[] array = { 7, 4, 8, 1, 3 };

for ( int i = 0; i < array.length; i++ ) {
    trocou = false;
    for ( int j = 0; j < array.length - i - 1; j++ ) {
        if ( array[j] > array[j+1] ) {
            int t = array[j];
            array[j] = array[j+1];
            array[j+1] = t;
            trocou = true;
        }
    }
    if ( !trocou ) {
        break;
    }
}

Não testei nenhum dos três exemplos.