Algoritmos de Ordenação em Java
Algoritmos de Ordenação em Java
Algoritmos de Ordenação em Java
INICIAR
ASSINE MVP
Buscar
comentrios
favorito (3)
para impresso
anotar
Gostei
(3)
(0)
Neste
artigo veremos como aplicar algoritmos de ordenao em Java, dada a sua devida
necessidade em ocasies
especficas. Existem diversas aplicabilidades para a
ordernao de dados, no s em Java, mas no mundo computacional
como um todo.
A
ideia de conhecer diversos algoritmos para ordenar dados saber qual utilizar
para conseguir um melhor desempenho ou
uma melhor legibilidade de cdigo,
dependendo da necessidade. No precisamos usar, por exemplo, um algoritmo
Para
analisar um algoritmo de ordenao voc deve conhecer a sua complexidade no
Pior Caso, Caso Mdio e o melhor
caso. Estas trs caractersticas presentes em
todos os algoritmos dizem respeito a sua velocidade dada uma situao
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
Algoritmos
de Ordenao
InsertionSort
Sua
teoria baseia-se em ordenar os valores da esquerda para a direita, deixando os
elementos lidos (a esquerda)
ordenados. Este geralmente utilizado para
ordenar um pequeno nmero de valores, onde faz-se muito eficiente. A
complexidade do cdigo :
Complexidade
Pior Caso: O(n)
Complexidade
Caso Mdio: O(n)
Complexidade
Melhor Caso: O(n)
Quando
temos um caso onde a complexidade n devemos evitar, visto que a
reduo de desempenho deste algoritmo
exponencial. Porm, no seu melhor caso
temos uma constante n que significa a inalterao da velocidade,
proporcional
quantidade de elementos.
O
melhor caso ocorre quando todos os elementos j esto ordenados e o pior caso
exatamente o contrrio, quando todos
os elementos esto desordenados. Vejamos
um exemplo para entender melhor essa teoria na Listagem 1.
Listagem
1. Aplicando InsertionSort
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
int i;
for (j = 1; j < vetor.length; j++)
{
key = vetor[j];
for (i = j - 1; (i >= 0) && (vetor[i] > key); i--)
{
vetor[i + 1] = vetor[i];
}
vetor[i + 1] = key;
}
}
O
primeiro passo entender o funcionamento do mtodo insertionSort(). Este ir
percorrer todo o vetor comeando do
segundo elemento e atribuindo o mesmo a uma
varivel chamada key.
O
algoritmo comea fazendo uma iterao em todos os elementos do vetor, a partir
do segundo elemento, por isso j=1 e
no j=0.
A
varivel key armazena inicialmente o primeiro valor
lido pelo lao for, que no caso ser o segundo elemento do vetor. O
segundo
lao itera sobre os valores que esto antes da varivel key:
key = vetor[j];
for (i = j - 1; (i >= 0) && (vetor[i] > key); i--)
segundo valor. Na primeira iterao do segundo lao for o valor de i ser igual
a 0, porque o j ser igual a 1, sendo assim o
i >= 0 e o vetor[0] maior
que 20, pois vetor[0] = 30. Ao acessar o segundo lao for feita uma
atribuio.
A
varivel i serve para comparar sempre o elemento atual com o elemento
anterior, pois ele faz com que seja possvel
percorrer todos os elementos
anteriores ao atual at achar algum que seja maior que o atual, fazendo com que
este seja
substitudo. Conforme a iterao for avanando os elementos a
esquerda vo ficando ordenados.
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
Vejamos
agora o que foi feito dentro do mtodo main(), que ser usado durante todo o
desenvolvimento deste artigo.
O
mtodo main() possui uma iterao para preencher elementos de forma randmica:
O cdigo da Listagem
1 representa o caso mdio, onde alguns valores podem j estar ordenados e
outros no, visto que
usamos o Math.random() e no saberemos qual vetor ser
construdo. Para testar o melhor caso voc deve trocar a linha
mencionada por:
Vejamos na Tabela
1 os tempos mdios: como o pior caso e o caso mdio possuem a mesma
complexidade decidimos
fazer a anlise de apenas um destes.
InsertionSort
Elementos
Caso mdio
(n)
Melhor Caso
(n)
100
0 ms
0 ms
1.000
11 ms
0 ms
10.000
220 ms
1 ms
100.000
5110 ms
6 ms
200.000
20.272 ms
8 ms
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
BubbleSort
O BubbleSort conhecido pela sua
simplicidade e pela eficcia ao realizar ordenaes em um nmero limitado de
valores.
Seu princpio baseia-se na troca de valores entre posies
consecutivas, fazendo com que valores altos ou baixos
(dependendo da forma de
ordenao desejada) borbulhem para o final da fila, por isso este algoritmo
chamado de
BubbleSort. Sua complexidade :
Complexidade
Pior Caso: O(n)
Complexidade
Caso Mdio: O(n)
Complexidade
Melhor Caso: O(n)
Listagem 2. BubbleSort
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
elemento atual que est sendo lido maior que o prximo elemento que ser
lido.
existe.
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
BubbleSort
Elementos
Caso mdio
(n)
Melhor Caso
(n)
100
0 ms
0 ms
1.000
15 ms
0 ms
10.000
200 ms
0 ms
100.000
20.426 ms
2 ms
200.000
81.659 ms
4 ms
Tabela
2. Medio de Tempo para BubbleSort
Analisando
a Tabela 2 podemos perceber que at
1000 elementos o BubbleSort eficiente e realiza a ordenao de forma
eficaz,
porm com valores maiores j se torna mais lento. No melhor caso quase no h
alterao para o tempo de
resposta deste algoritmo, visto que ele apenas
passar dentro do lao for sem entrar nenhuma vez na condio para
realizar a
troca de elementos.
QuickSort
Este
algoritmo usa uma tcnica conhecida por diviso e conquista, muito conhecida
por reduzir problemas complexos em
problemas menores para tentar chegar em uma
soluo. Sendo assim, o resultado do problema inicial dada como a soma
do
resultado de todos os problemas menores. Sua complexidade :
Complexidade
Pior Caso: O(n)
Complexidade
Caso Mdio: (nlogn)
Complexidade
Melhor Caso: (nlogn)
O
QuickSort sai na frente de outros algoritmos mais simples quando tratamos do
caso mdio, por trabalhar com logaritmo
(nlogn), o que torna o resultado mais
rpido do que o InsertionSort e o QuickSort.
O
algoritmo consiste nos seguintes passos:
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
Seu
algoritmo pode ser visto na Listagem 3.
Listagem
3. QuickSort
O
primeiro passo separar as listas, como havamos citado anteriormente. No
mtodo separar() esse processo realizado
at que seja retornado um piv, ou
seja, o elemento divisvel entre as duas listas.
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
Finalizado
o processo de separao ento chamado um prprio mtodo quickSort() de forma
recursiva, onde ele far o
processo de separao interna dentro da sublista e
assim ser feito at que todos os elementos estejam ordenados.
Se
voc preferir, na Listagem 4 tambm temos
um pseudocdigo que exemplifica o funcionamento do QuickSort em
linguagem
genrica.
Listagem
4. Pseudocdigo quicksort
i <- i + 1
fimEnquanto
j <- j - 1
fimEnquanto
se (i <= j) ento
aux
<- X[i]
i <- i + 1
j <- j - 1
fimSe
fimEnquanto
se (j > IniVet) ento
|
QuickSort(X, IniVet, j)
fimSe
se (i < FimVet) ento
|
QuickSort(X, i, FimVet)
fimse
fimprocedimento
O
QuickSort um algoritmo mais robusto e complexo que os mostrados anteriormente,
por isso achamos importante
exemplificar o seu uso atravs do pseudocdigo.
Vejamos
na Tabela 3 a comparao entre o
tempo de execuo.
QuickSort
Elementos
Caso mdio
(nlogn)
100
0 ms
1.000
0 ms
10.000
39 ms
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
100.000
43 ms
200.000
50 ms
Tabela
3. Medio do Tempo de execuo para QuickSort
Veja
que o tempo de processamento do QuickSort muito bom quando tratamos do caso
mdio, que exatamente o nosso
caso (randmico). Veja que o tempo para 200.000
registros muito eficiente, muito mais que os mostrados anteriormente
para
este tipo de caso.
Com
isso, vimos que em se tratando de simplicidade, o BubbleSort o melhor, visto
que sua implementao e lgica so
simples e eficazes para uma pequena
quantidade de valores, porm precisamos de algoritmos mais robustos quando
Por
outro lado, o InsertionSort no to complexo quanto o QuickSort, mas tambm
no to simples quanto o BubbleSort,
acrescentando um pouco mais de robustez
e consequentemente desempenho na ordenao de valores. O InsertionSort
um
meio termo e possibilita a ordenao de valores um pouco maiores que o
BubbleSort, mas tambm no consegue
ordenar uma grande quantidade de valores
igual ao QuickSort, que por sua vez, mostrou-se o algoritmo mais rpido de
Ao
trabalhar com uma quantidade de valores maior, j percebemos que algoritmos
simples podem no ser a melhor
escolha, voc mesmo pode fazer um teste tentando
executar o BubbleSort para um milho de elementos. Se para 200.000
elementos o
tempo de resposta foi quase 82 segundos e o mesmo cresce de forma exponencial,
ento para um milho de
elementos possivelmente chegar perto ou passar
(dependendo do hardware) de horas.
Testamos
de forma exaustiva o algoritmo QuickSort para o melhor caso com 100 elementos
no vetor, e constatamos que
em alguns momentos ocorrem alguns picos de
velocidade onde o retorno muda de 1ms para 5ms, apontando uma pequena
perda de
desempenho. Testando a mesma quantidade de elementos para o melhor caso no
BubbleSort a varivel no
ocorreu nenhuma vez, mantendo a velocidade sempre em
1ms. Apontando um ponto positivo para o algoritmo mais simples
em casos
especficos.
Ronaldo Lanhellas
Bacharel em Cincia da Computao (UNAMA). Cursando Ps-Graduao em Tecnologias WEB (UFPA). Trabalhando atualmente como Analista de
Sistemas Java.
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
Publicado em 2015
(0)
Meus comentarios
MVP
Muito interessante, mas como eu descubro o tempo que o algoritmo levou para ordenar meu array? **utilizo o netbeans
[h +1 ms] - Responder
Douglas Claudio
Ol Wellington, obrigado pelo seu comentrio.
Enviamos sua solicitao ao Ronaldo e estamos no aguardo de um feedback do mesmo.
Um abrao.
[h +1 ms] - Responder
MVP
Consegui entender o funcionamento, faltou mesmo foi ateno da minha parte rs.
[h +1 ms] - Responder
Douglas Claudio
Ol Wellington,
Qualquer problema conte conosco e obrigado por compartilhar a sua soluo.
Um abrao.
[h +1 ms] - Responder
Publicidade
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
Mais posts
Artigo
Introduo ao Facelets
JAVA
JSF
Artigo
JAVA
Artigo
JAVA
Artigo
JAVA
RASPBERRY
JAVA
JPA
RXTX
Artigo
CRUD
HIBERNATE
Artigo
JAVA
DAO
Artigo
JAVA
Artigo
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]
JAVA
LAMBDA
BIGDATA
JAVA
BOAS PRATICAS
.NET
PROGRAMAO
http://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693[30/06/2015 11:33:59]