Pra que usar dois for um dentro do outro para organizar vetor com Bubble Sort?
- Pegue uma folha de papel;
- Escreva uns 5 números, um ao lado do outro, digamos 7, 4, 8, 1, 3.
- Pense num algoritmo para colocá-los em ordem, comparando os valores;
- Fique atento ao que você está pensando e tente generalizar o processo;
- 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;
- 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.