Translate

sábado, 12 de abril de 2014

Algoritmo Ordenação Bubble Sort


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