Desenvolvimento - Java
Bubble Sort com Java
Este artigo tem como objetivo demonstrar a ordenação bubble sort, na linguagem java, mas independente da linguagem, este artigo orienta e demonstra como ocorre o bubble sort e explica alguns conceitos de java.
por Guilherme de Oliveira SantosIntrodução: Este artigo tem como objetivo orientar um usuário a realizar uma ordenação numérica simples (Bubble Sort), onde serão abordadas 2 classes pré-existentes no Java (import), utilizando-se também do conceito classe.método para obtenção de dados, estruturas (do, while, if , for e switch), declaração de vetor e alguns tipo de variáveis. Tendo em vista a aplicação de muitos conceitos iniciais do Java, para uma introdução no mundo Java.
Ferramentas utilizadas e link para Download:
NetBeans 7.0.1
http://netbeans.org/downloads/index.html
SDK 7
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Visualização do código em html : http://www.mediafire.com/?56ql8221534neam
Para melhor visualização do código.
Vamos abordar alguns conceitos utilizados aqui, neste tutorial. Para um melhor entendimento do todo. O que não for abordado aqui, é porque os comentários no código descrevem o que o mesmo faz perfeitamente.
IMPORT
import javax.swing.JOptionPane;
import java.lang.Math;
este comando (import) é utilizado para importar uma classe pré-existente no Java, para assim utilizarmos de seus métodos.
Javax.Swing.JoptionPane ->
interface
java.lang.Math -> classe matemática.
Estruturas
· if (Condiçao){}-> if é uma estrutura de decisão baseada na condição escrita dentro do (). Se a condição for atendedida, ele executa todo o código dentro das {}. Ex: if (vet[i]>vet[j]), se o vetor de índice i for maior que o vetor de índice j, ele executará o corpo dentro das {}.
· Do{ código
}while(condição) -> do while, é uma condição de faça(do) enquanto(while), sendo assim o código dentro das {} será repetido até fugir da condição do while.
Ex: do{código}while(menu!=9), o código será repetido até o valor da variável menu ser 9, pois a condição é faça(do) enquanto(while) for diferente (!=) de 9, então quando o valor for 9, ele atenderá a condição e sairá do laço de repetição.
· O while(condição) -> pode ser utilizado sozinho antes de uma parte do seu código fazendo assim ele executá-lo enquanto estiver na condição do while.
Ex: while(option!=1 && option!=2){codigo} enquanto for (!=)diferente de 1 (&&)ou 2 ele executará o que está dentro das {}
· switch (menu) { -> a estrutura switch, é uma estrutura de
case(x): código decisão, baseada no valor da variável
break;} menu(ou outra que desejar),conforme a atribuiçao da variável seguem as opções dentro dos cases(x) (x um valor que deseja como opção), sendo assim conforme a opção desejada ele percorre um código diferente. E o break, encerra a opção.
Ex: switch (menu) { // estrutura de decisão SWITCH
case (1): //Opção 1
OrdenaCrescente(); //Chamando o método OrdenaCrescente
break;//finaliza a opção
case (2): //Opção 2
OrdenaDecrescente();
... e assim em diante.
· for (valor inicial; valor final; soma ou subtração do valor ){código}
-> for é uma estrutura de repetição, onde ele irá repetir o código dentro das {}, até chegar ao seu valor final.
Valor inicial – ele inicia com um valor
Valor final – até quando esse código deve ser repetido
Soma ou subtração – soma ou subtração do valor inicial, tendo em vista que ele deve atingir o valor final.
Ex: for (i=0; i<(vet.length); i++){código}
Valor inicial- i=0
Valor final – tamanho do vetor (vet.length)
Soma ou subtração – soma de 1 em 1 ( i++)
Classe.Método
Neste tutorial utilizamos desta abordagem classe.metodo.
Ex: vet.length, vet é a variável de referencia do vetor, e length é um método pertencente a classe vetor para coletar o tamanho do mesmo.
Toda vez que você ver essa abordagem classe.método saiba que ela é utilizada para chamada do método que existe dentro da classe abordada.
Explicação de como funciona o bubble sort.
Baseado na ordenação crescente segue o código
for(i=0; i<(vet.length)-1; i++){ // o I só será somado quando acabar o laço J
for(j=i+1; j<(vet.length); j++){
if (vet[i]>vet[j]) {
aux=vet[i];
vet[i]=vet[j];
vet[j]=aux;
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
}//fim da estrutura for de indice i
Vet.length ( tamnho do vetor =5)
I- inicia com 0 cor VERDE
J- inicia com i+1 (se i for 0 j sera 1, se i for 2 j sera 3) cor VERMELHA
Índices do vetor
0 1 2 3 4
5 |
2 |
1 |
7 |
8 |
I-está no índice 0 (for do i)
j-está no índice 1 (for do j)
comparando (if) – numero do I é maior do que o de J ???
sim.
Então trocamos.
if (vet[i]>vet[j]) {
aux=vet[i];
vet[i]=vet[j];
vet[j]=aux;
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J
}
0 1 2 3 4
2 |
5 |
1 |
7 |
8 |
I-está no índice 0 (for do i)
j-está no índice 2 (for do j)
comparando (if) – numero do I é maior do que o de J ???
sim.
Então trocamos.
if (vet[i]>vet[j]) {
aux=vet[i];
vet[i]=vet[j];
vet[j]=aux;
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J
}
0 1 2 3 4
1 |
5 |
2 |
7 |
8 |
I-está no índice 0 (for do i)
j-está no índice 3 (for do j)
comparando (if) – numero do I é maior do que o de J ???
não.
Então não executamos o código dentro do if, portanto não efetuamos a troca
if (vet[i]>vet[j]) {
pula o código porque não atende a condição
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J
}
0 1 2 3 4
1 |
5 |
2 |
7 |
8 |
I-está no índice 0 (for do i)
j-está no índice 4 (for do j)
comparando (if) – numero do I é maior do que o de J ???
não.
Então não executamos o código dentro do if, portanto não efetuamos a troca
if (vet[i]>vet[j]) {
pula o código porque não atende a condição
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J, J ultrapasso o valor final. Agora ele sairá do laço J.
}após sair do laço j, será acrescido 1 ao I, e J iniciará novamente com seu valor inicial, tendo em vista que I será 1 e J é I+1, J iniciará com o valor de 2.
0 1 2 3 4
1 |
5 |
2 |
7 |
8 |
I-está no índice 1 (for do i)
j-está no índice 2 (for do j)
comparando (if) – numero do I é maior do que o de J ???
sim.
Então trocamos.
if (vet[i]>vet[j]) {
aux=vet[i];
vet[i]=vet[j];
vet[j]=aux;
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J
}
0 1 2 3 4
1 |
2 |
5 |
7 |
8 |
I-está no índice 1 (for do i)
j-está no índice 3 (for do j)
comparando (if) – numero do I é maior do que o de J ???
não.
Então não executamos o código dentro do if, portanto não efetuamos a troca
if (vet[i]>vet[j]) {
pula o código porque não atende a condição
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J
}
0 1 2 3 4
1 |
2 |
5 |
7 |
8 |
I-está no índice 1 (for do i)
j-está no índice 4 (for do j)
comparando (if) – numero do I é maior do que o de J ???
não.
Então não executamos o código dentro do if, portanto não efetuamos a troca
if (vet[i]>vet[j]) {
pula o código porque não atende a condição
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J, J ultrapasso o valor final. Agora ele sairá do laço J.
}após sair do laço j, será acrescido 1 ao I, e J iniciará novamente com seu valor inicial, tendo em vista que I será 2 e J é I+1, J iniciará com o valor de 3.
0 1 2 3 4
1 |
2 |
5 |
7 |
8 |
I-está no índice 2 (for do i)
j-está no índice 3 (for do j)
comparando (if) – numero do I é maior do que o de J ???
não.
Então não executamos o código dentro do if, portanto não efetuamos a troca
if (vet[i]>vet[j]) {
pula o código porque não atende a condição
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J
}
0 1 2 3 4
1 |
2 |
5 |
7 |
8 |
I-está no índice 2 (for do i)
j-está no índice 4 (for do j)
comparando (if) – numero do I é maior do que o de J ???
não.
Então não executamos o código dentro do if, portanto não efetuamos a troca
if (vet[i]>vet[j]) {
pula o código porque não atende a condição
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J, J ultrapasso o valor final. Agora ele sairá do laço J.
}após sair do laço j, será acrescido 1 ao I, e J iniciará novamente com seu valor inicial, tendo em vista que I será 3 e J é I+1, J iniciará com o valor de 4.
0 1 2 3 4
1 |
2 |
5 |
7 |
8 |
I-está no índice 2 (for do i)
j-está no índice 4 (for do j)
comparando (if) – numero do I é maior do que o de J ???
não.
Então não executamos o código dentro do if, portanto não efetuamos a troca
if (vet[i]>vet[j]) {
pula o código porque não atende a condição
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
Soma 1 ao J, J ultrapasso o valor final. Agora ele sairá do laço J.
}após sair do laço j, será acrescido 1 ao I, I ultrapassou o valor final, agora ele sai do laço I, portanto acaba todo a estrutura de repetição encadeada ( encadeada = uma estrutura dentro da outra).
COMEÇANDO O PROJETO
Abra sua IDE e crie um novo Projeto em Java.
escolha a categoria Java, projetos aplicativo Java.
Atribua um nome ao seu projeto, aqui utilizamos Ordem.
Certo, agora que você já abriu seu projeto, vamos seguir com a codificaçao da nossa ordenação simples (bubble sort).
Vou separar o corpo do código, em métodos, para uma maior facilidade de interpretação, mas no inicio do tutorial segue o link, para download do código em html para uma melhor visualização e entendimento.
O que está em verde, são comentarios em cima do código para melhor compreenção do mesmo.
Segue declaração da classe Ordem e método principal.
@author Guilherme O. Santos
import javax.swing.JOptionPane; // importando uma classe pré existente no java
import java.lang.Math; // importando uma classe pré existente no java
public class Ordem { //declaração da classe com o nome identico ao do projeto
static int i,j,aux,menu,option; //declarando variáveis do tipo INTEIRO
static int vet[] = new int[10]; // declarando um vetor do tipo INTEIRO
public static void main(String[] args){ //método principal
Inserir(); //Chamando o método inserir
do{ //estrutura de repetição FAÇA
menu = Integer.parseInt(JOptionPane.showInputDialog ("INSIRA O Nº CORRESPONDENTE A OPERAÇAO:\n\n" //Introduçao de dados na variável de controle MENU através de uma interface.
+ "1 - Ordenar em ordem Crescente.\n"
+ "2 - Ordenar em ordem Decrescente.\n"
+ "3 - Inserir novos valores.\n"
+ "4 - Simular novos valores\n"
+ " 9 - Sair.")); // Opçoes correspondentes a estrutura de decisão SWITCH abaixo.
switch (menu) { // estrutura de decisão SWITCH
case (1): //Opção 1
OrdenaCrescente(); //Chamando o método OrdenaCrescente
break;//finaliza a opção
case (2): //Opção 2
OrdenaDecrescente(); //Chamando o método OrdenaDecrescente
break;//finaliza a opção
case (3): //Opção 3
InserirValor(); //Chamando o método InserirValor
break;//finaliza a opção
case(4): //Opção 4
Random(); //Chamando o método Random
break;//finaliza a opção
case (9): //Opção 5
System.exit(0); //Chamando o método exit da classe system (classe.método = System.exit())
break;//finaliza a opção
}//fim do switch
}while(menu!=9); //estrutura de repetição while associada ao DO, DO WHILE ( faça enquanto a condiçao for verdadeira)
//fim do DO.
}//fim do método principal
Segue declaração do método Inserir ()
/*método para inserir dados no vetor vet[]
* dando a opção de escolher os numeros
* ou sortia-los.
*/
private static void Inserir(){ //declaraçao do metodo Inserir
while(option!=1 && option!=2){ //estrutura de repetição While (Enquanto)
option = Integer.parseInt(JOptionPane.showInputDialog ("INSIRA O Nº CORRESPONDENTE A OPERAÇAO:\n\n"//Introduçao de dados na variável de controle OPTION através de uma interface.
+ "1 - Inserir novos valores\n"
+ "2 - Simular novos valor"));// Opçoes correspondentes a estrutura de decisão SWITCH abaixo.
switch (option) {// estrutura de decisão SWITCH
case(1): InserirValor(); //Chamando o método InserirValor
break;//finaliza a opção
case(2): Random(); //Chamando o método Random
break;//finaliza a opção
} //fim do switch
}// fim do while (enquanto)
}//fim do metodo Inserir()
Segue declaração do método InserirValor()
/*
*metodo para inserir valores manualmente no vetor vet[]
*/
private static void InserirValor(){ //declaraçao do metodo Inserir
for (i=0; i<(vet.length); i++) { //estrutura de repetição FOR ( para )
aux= i + 1;// atribuiçao do valor de i + 1 na variavel aux
vet[i] = Integer.parseInt(JOptionPane.showInputDialog("insira o "+aux+"º valor:"));//Introduçao de dados no vetor vet[i] tendo i como indice.
}//fim da estrutura for
JOptionPane.showMessageDialog(null,"os valores são: ["// exibiçao de dados atravez de uma interface
+vet[0]+","+vet[1]+","+vet[2]+","+vet[3]+","+vet[4]+","+vet[5]+","+vet[6]+","+vet[7]+","+vet[8]+","+vet[9]+"]");
}//fim do metodo InserirValor()
Segue declaração do método Random()
/*
* metodo para inserir valores sortidos no vetor vet[]
*/
private static void Random(){//declaraçao do metodo Random()
long aux2=0;//declaraçao de variavel local do tipo LONG
for (i=0; i<(vet.length); i++) {//estrutura de repetição FOR ( para )
aux2 = Math.round(Math.random()*100); // atribuiçao de um valor sortido a variavel aux2
vet[i] =(int) aux2;//atribuiçao do valor de aux2 para vet[] de indice i. (int) serve para forçar o valor a ser um INTEIRO
}//fim da estrutura for
JOptionPane.showMessageDialog(null,"os valores são: ["// exibiçao de dados atravez de uma interface
+aux2+""+vet[0]+","+vet[1]+","+vet[2]+","+vet[3]+","+vet[4]+","+vet[5]+","+vet[6]+","+vet[7]+","+vet[8]+","+vet[9]+"]");
}//fim do metodo Random()
Segue declaração do método OrdenaCrescente()
/*
* metodo para ordenar os valores do vetor vet[] em ordem crescente
*/
public static void OrdenaCrescente(){//declaraçao do metodo OrdenaCrescente
for(i=0; i<(vet.length)-1; i++){//estrutura de repetição FOR ( para )
for(j=i+1; j<(vet.length); j++){//estrutura de repetição FOR ( para )
if (vet[i]>vet[j]) {//estrutura de decisao IF ( se(condiçao) ) se atender a condiçao executa todo o código dentro da estrutura
aux=vet[i];// aux recebe o valor do vet[] de indice i
vet[i]=vet[j];// vet[] de indice i recebe o valor do vet[] de indice j
vet[j]=aux;// vet[] de indice j recebe o valor do aux ( que era o valor do vet[] de indice i
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
}//fim da estrutura for de indice i
JOptionPane.showMessageDialog(null,"Os valores em Ordem Crescente: ["// exibiçao dos dados atravez de uma interface
+vet[0]+","+vet[1]+","+vet[2]+","+vet[3]+","+vet[4]+","+vet[5]+","+vet[6]+","+vet[7]+","+vet[8]+","+vet[9]+"]");
}//fim do metoro OrdenaCrescente()
Segue declaração do método OrdenaDecrescente()
/*metoro para ordenar os valores do vetor vet[] em ordem decrescente
*
*/
public static void OrdenaDecrescente(){//declaraçao do metodo OrdenaDecrescente
for(i=0; i<(vet.length)-1; i++){//estrutura de repetição FOR ( para )
for(j=i+1; j<(vet.length); j++){//estrutura de repetição FOR ( para )
if (vet[i]<vet[j]) {//estrutura de decisao IF ( se(condiçao) ) se atender a condiçao executa todo o código dentro da estrutura
aux=vet[i];// aux recebe o valor do vet[] de indice i
vet[i]=vet[j];// vet[] de indice i recebe o valor do vet[] de indice j
vet[j]=aux;// vet[] de indice j recebe o valor do aux ( que era o valor do vet[] de indice i
}//fim da estrutura IF (se)
}//fim da estrutura for de indice j
}//fim da estrutura for de indice i
JOptionPane.showMessageDialog(null,"Os valores em Ordem Decrescente: ["// exibiçao dos dados atravez de uma interface
+vet[0]+","+vet[1]+","+vet[2]+","+vet[3]+","+vet[4]+","+vet[5]+","+vet[6]+","+vet[7]+","+vet[8]+","+vet[9]+"]");
}//fim do metodo OrdenaDecrescente
}//fim da classe Ordem
Simulaçao utilizando o sorteio automático dos números.
Iniciado
Escolhi a opção 2 para sorteio dos números. ok
Números sorteados. ok
Menu de opções
Escolhi 1 para ordenar em ordem crescente. Ok
Ordenado em ordem crescente. Ok
Retorna ao menu.
Escolhi 2 para ordenar em ordem decrescente. Ok
Ordenado em ordem decrescente.ok
Retorna ao menu.
Escolhi a opção 9 para sair do programa. Ok
Programa finalizado.
É isso ae pessoal, espero que eu tenha ajudado vocês a compreenderem ordenação simples bubble sort.
Até mais.