As linguagens de programações atuais, esbanjam praticidade quando o assunto é ordenação de listas.
Com pouquíssimas linhas como mostrado aqui em posts anteriores, podemos ordenar nossas listas.
Para quem gosta de brincar com algoritmos, vamos desenvolver neste pequeno tutorial o Algoritmo Bubble Sort, bastante conhecido.
É interessante se conhecer a forma de aplicar tais algoritmos, pois não é em todas linguagens que temos tanta praticidade para ordenar listas.
Conhecer um algoritmo de ordenação, como o Bubble Sort, por exemplo, é uma boa ideia quando se trabalha programando para dispositivos com capacidades computacionais reduzidas como microcontroladores.
Conhecendo o Algoritmo Bubble Sort
No vídeo abaixo, um grupo de dança demonstra de forma muito bem humorada o funcionamento do Algoritmo Bubble Sort:
O algoritmo consiste basicamente em ordenar um vetor de n posições, a partir de pequenas partes do mesmo.
O algoritmo varre o vetor, ordenando os pares. Como demonstra a figura abaixo:
Após concluir a ordenação por pares, pode ocorrer do vetor ainda não estar ordenado conforme se deseja. Assim sendo o algoritmo deve ser executado de forma recursiva até que a ordenação do vetor se complete.
Mais informações podem ser encontradas no Site da Wikipedia.
Bubble Sort com JAVA
Abaixo, descrevemos um código que carrega um vetor carregado com números aleatoriamente.
/**
* Preenche o vetor com numeros aleatórios
*/
for (int i = 0; i < vetor.length; i++) {
vetor[i] = (int) (Math.random() * 100);
}
Após executa um método que exibe o vetor (ainda fora de ordem) na tela.
/**
* Metodo que recebe um vetor e exibe o mesmo na tela
*/
private void exibeVetor(int[] v) {
System.out.println("\n");
for (int i = 0; i < v.length; i++) {
System.out.print(v[i] + " ");
}
}
Agora é hora da mágica! O método abaixo ordena o vetor, verificando os valores contidos nos índices e comparando-os com os valores do próximo índice. Caso o valor do índice atual for menor do que do índice posterior, ele inverte a posição dos mesmos, com o auxilio de uma variável de controle.
/**
* Metodo responsavel por varrer o vetor e ordenar os pares
*/
private void ordenaBubbleSort(int[] v) {
for (int i = 0; i < v.length; i++) {
/**
* Caso o índice atual do vetor for o ultimo, não precisa ordenar
*/
if (i != v.length - 1) {
/**
* Verifica se os valores não estão em ordem crescente
*/
if (!(v[i] <= v[i + 1])) {
/**
* atribui o valor do indice a uma variavel temporaria
*/
int valorTemp = v[i];
/**
* coloca o valor do proximo indice no indice atual
*/
v[i] = v[i + 1];
/**
* atribui o valor da variavel temporaria no proximo indice
*/
v[i + 1] = valorTemp;
}
}
}
if (!isVetorOrdenado(v)) {
ordenaBubbleSort(v);
}
}
O método abaixo verifica se o vetor esta em ordem.
/**
* Metodo que verifica se o vetor está em ordem
* Retorna 'true' se estiver atualizado
*/
private boolean isVetorOrdenado(int[] v) {
for (int i = 0; i < v.length; i++) {
/**
* Caso o índice atual do vetor for o ultimo, não precisa ordenar
*/
if (i != v.length - 1) {
/**
* Verifica se o indice atual e o próximo estão ordenados;
*
* Caso estejam, checa os proximos indices
*/
if (!(v[i] <= v[i + 1])) {
return false;
}
}
}
return true;
}
Finalmente, acrescentamos o trecho abaixo, no final do método ordenaBubbleSort(), de forma a definir se é ou não necessária a recursão.
if (!isVetorOrdenado(v)) {
ordenaBubbleSort(v);
}
Após, evocamos finalmente o método exibeVetor() para mostrá-lo na tela.
Abaixo a classe completa, já com o método main();
package bubblesort;
public class BubbleSort {
/**
* Constante com o tamanho do vetor a ser criado
*/
public static final int TAMANHO_VETOR = 11;
public static void main(String[] args) {
BubbleSort bubbleSort = new BubbleSort();
int[] vetor = new int[TAMANHO_VETOR];
/**
* Preenche o vetor com numeros aleatórios
*/
for (int i = 0; i < vetor.length; i++) {
vetor[i] = (int) (Math.random() * 100);
}
bubbleSort.exibeVetor(vetor);
bubbleSort.ordenaBubbleSort(vetor);
bubbleSort.exibeVetor(vetor);
}
/**
* Metodo responsavel por varrer o vetor e ordenar os pares
*/
private void ordenaBubbleSort(int[] v) {
for (int i = 0; i < v.length; i++) {
/**
* Caso o índice atual do vetor for o ultimo, não precisa ordenar
*/
if (i != v.length - 1) {
/**
* Verifica se os valores não estão em ordem crescente
*/
if (!(v[i] <= v[i + 1])) {
/**
* atribui o valor do indice a uma variavel temporaria
*/
int valorTemp = v[i];
/**
* coloca o valor do proximo indice no indice atual
*/
v[i] = v[i + 1];
/**
* atribui o valor da variavel temporaria no proximo indice
*/
v[i + 1] = valorTemp;
}
}
}
if (!isVetorOrdenado(v)) {
ordenaBubbleSort(v);
}
}
/**
* Metodo que verifica se o vetor está em ordem
* Retorna 'true' se estiver atualizado
*/
private boolean isVetorOrdenado(int[] v) {
for (int i = 0; i < v.length; i++) {
/**
* Caso o índice atual do vetor for o ultimo, não precisa ordenar
*/
if (i != v.length - 1) {
/**
* Verifica se o indice atual e o próximo estão ordenados;
*
* Caso estejam, checa os proximos indices
*/
if (!(v[i] <= v[i + 1])) {
return false;
}
}
}
return true;
}
/**
* Metodo que recebe um vetor e exibe o mesmo na tela
*/
private void exibeVetor(int[] v) {
System.out.println("\n");
for (int i = 0; i < v.length; i++) {
System.out.print(v[i] + " ");
}
}
}

Nenhum comentário:
Postar um comentário