O Bubble-Sort é um dos algoritmos de ordenação mais simples, que consiste em percorrer os N elementos de um vetor, para cada vez percorrida, todos os elementos são comparados com o seu próximo, para verificar se estão na ordem desejada.
Execução do algoritmo de Bubble Sort
Na primeira iteração, é encontrado o maior elemento e o mesmo é deslocado até a ultima posição. Na segunda iteração, é encontrado o segundo maior elemento e o mesmo é deslocado até a penúltima posição. Continua até que todos os elementos serem ordenados.
Não é obrigatório colocar sempre o maior elemento no final do vetor, dependendo da sua lógica de programação, é possível deixar os elementos de forma decrescente.
Implementação do Bubble Sort
Na linha 19 temos a assinatura do método que ordena um vetor de inteiros.
Na linha 21 temos um for para controlar a quantidade de vezes que esse vetor será ordenado, no caso (v.length – 1) vezes.
Na linha 23 temos um for para ordenar os elementos do vetor, este for irá ordenar (v.length – 1 – i) vezes. Na quantidade de vezes que o vetor é ordenado subtraímos pela quantidade de iterações que será realizada no caso a variável i, porque sabemos que quando uma iteração termina o ultimo elemento já está ordenado.
Na linha 26 verificamos se o valor da posição atual do vetor é maior que o próximo valor do vetor, se for maior trocamos os valores de lugar.
Uma forma melhorada do Bubble Sort
Se repararmos na execução do Bubble Sort demonstrado no exemplo anterior, podemos perceber que se o vetor já estiver ordenado antes de chamar o método que ordena, será realizado as (v.length – 1) vezes iterações sobre ele e será comparado todos elementos dele para ver se está ordenado.
Podemos melhorar isso adicionando uma variável de controle que verifica se houve troca de valores no vetor, porque se durante uma iteração não houver nenhuma troca de valor, significa que o vetor já está ordenado.
Versão melhorada do Bubble Sort:
Na linha 23 foi criada uma variável boolean para controlar se o vetor está ordenado.
Na linha 32 se houve alguma troca de valor, então o vetor ainda não está totalmente ordenado, e a variável de controle é alterada para falso.
Na linha 36 se o vetor estiver ordenado então para a execução do for que controla a quantidade de vezes que o vetor será ordenado.
Exemplo de ordenação de vetor de objetos
Neste exemplo temos uma classe Animal e cada animal tem uma especie e um nome.
A partir da classe Animal, criamos um vetor de animais e queremos ordenar os animais pelo nome.
Segue abaixo a implementação do programa que ordena o vetor de animais utilizando o algoritmo de Bubble Sort.
Na linha 28 temos a assinatura do método que ordena um vetor de animais.
Na linha 30 temos um for para controlar a quantidade de vezes que esse vetor será ordenado, no caso (animais.length – 1) vezes.
Na linha 32 foi criada uma variável boolean para controlar se o vetor está ordenado.
Na linha 34 temos um for para ordenar os elementos do vetor, este for irá ordenar (animais.length – 1 – i) vezes. Na quantidade de vezes que o vetor é ordenado subtraímos pela quantidade de iterações que será realizada no caso a variável i, porque sabemos que quando uma iteração termina o ultimo elemento já está ordenado.
Na linha 37 verificamos se nome do animal da posição atual do vetor é maior que o nome do próximo animal do vetor, se for maior trocamos os animais de lugar.
Na linha 41 se houve alguma troca de animal, então o vetor ainda não está totalmente ordenado, e a variável de controle é alterada para falso.
Na linha 45 se o vetor estiver ordenado então para a execução do for que controla a quantidade de vezes que o vetor será ordenado.
Também podemos ordenar os animais pela especie e depois pelo nome do animal:
Na linha 65 verifica se o nome da especie do animal na posição atual do vetor é maior que a especie do próximo animal, se for então troca os animais de lugar.
Na linha 74 verifica se o nome da especie do animal na posição atual do vetor é igual a especie do próximo animal, se as espécies forem iguais, então verifica se o nome do animal na posição atual do vetor é maior que o nome do próximo animal, se for maior então troca os animais de lugar no vetor.