SlideShare une entreprise Scribd logo
1  sur  9
An´alise de Desempenho de Algoritmos de Ordenac¸˜ao
Gustavo de Carvalho Sales1
1
Departamento de Inform´atica e Estat´ıstica – Universidade Federal do Piau´ı (UFPI)
Teresina – PI – Brasil
gt.salles@gmail.com
Abstract. This paper is intended to evaluate the performance of six sorting al-
gorithms of vectors through a software that performs the tests and generates a
chart to be analyzed. Also in the article, it will be analyzed the complexity of
each algorithm and associated with the result obtained in the tests.
Resumo. Este artigo destina-se a avaliar o desempenho de seis algoritmos de
ordenac¸˜ao de vetores atrav´es de um software que realiza os testes e gera um
gr´afico a ser analisado. Ainda no artigo, ser´a analisada a complexidade de
cada algoritmo e esta, associada com o resultado obtido nos testes.
1. Introduc¸˜ao
O objetivo desse trabalho ´e realizar a implementac¸˜ao e comparac¸˜ao de desempenho dos
principais algoritmos de ordenac¸˜ao existentes.
O c´odigo fonte foi escrito na linguagem de programac¸˜ao Python, utilizando as
bibliotecas PyQt e Matplotlib para a interface gr´afica e para a criac¸˜ao dos gr´aficos respec-
tivamente e a IDE Eclipse.
O Computador onde foram desenvolvidos os testes possui a seguinte configurac¸˜ao:
• Processador Intel(R) Core(TM) i5-2430M CPU @ 2.40GHz
• 4GB de mem´oria RAM com frequˆencia de 1333Mhz
• Microsoft Windows 7 Ultimate 64 Bits
2. Especificac¸˜oes
O problema consiste em avaliar o desempenho dos seguintes algoritmos de ordenac¸˜ao de
vetores: Insertion Sort, Selection Sort, Bubble Sort, Merge Sort, Heap Sort e Quick Sort.
A avaliac¸˜ao ´e feita considerando o tempo de execuc¸˜ao dos algoritmos nas
seguintes condic¸˜oes:
• Vetores crescentes, decrescentes e aleat´orios
• O teste ´e realizado cinco vezes e ´e considerado como tempo final a m´edia dos
tempos das cinco execuc¸˜oes.
• Os algoritmos s˜ao executados para vetores com as seguintes quantidades de ele-
mentos: 1000, 5000, 10000, 20000, 30000 e 50000.
O software desenvolvido executa uma interface gr´afica onde ´e selecionado o al-
goritmo a ser utilizado. Uma vez que a execuc¸˜ao ´e iniciada, todo o resto do processo ´e
automatizado, o software executa para o algoritmo selecionado a ordenac¸˜ao dos trˆes tipos
de vetores e com as seis quantidades predefinidas. Ao final da execuc¸˜ao, s˜ao gerados
trˆes arquivos para cada algoritmo e ´e chamado o m´odulo que constr´oi o gr´afico lendo os
arquivos gerados pelo programa.
3. Desenvolvimento
Ordenar corresponde ao processo de rearranjar um conjunto de objetos em ordem as-
cendente ou descendente. O objetivo principal da ordenac¸˜ao ´e facilitar a recuperac¸˜ao
posterior de itens do conjunto ordenado.
A ordenac¸˜ao ´e uma operac¸˜ao fundamental em ciˆencia da computac¸˜ao (muitos pro-
gramas a utilizam como uma etapa intermedi´aria) e, como resultado, um grande n´umero
de bons algoritmos de ordenac¸˜ao tem sido desenvolvido. O melhor algoritmo para uma
determinada aplicac¸˜ao depende - entre outros fatores - do n´umero de itens a serem or-
denados, da extens˜ao em que os itens j´a est˜ao ordenados de algum modo, de poss´ıveis
restric¸˜oes sobre os valores de itens e da esp´ecie de dispositivo de armazenamento a ser
usado: mem´oria principal, discos ou fitas [Cormen et al. ].
3.1. Insertion Sort
Insertion sort ´e um algoritmo de ordenac¸˜ao simples, uma ordenac¸˜ao por comparac¸˜ao na
qual uma nova lista ´e constru´ıda um valor por vez. Isso ´e muito menos eficiente em
grandes listas do que outros algoritmos como quick sort, heap sort ou merge sort.
A complexidade do insertion sort no melhor caso ´e de Ω(n) de acordo com
[Ziviani 2004], visto que ele ir´a fazer n comparac¸˜oes e ver que o vetor j´a est´a ordenado.
No pior caso e no no caso m´edio a complexidade do insertion sort ´e de Θ(n2
).
Figure 1. Gr´afico de desempenho Insertion sort
Atrav´es do gr´afico percebe-se o desempenho incrivelmente superior para os ve-
tores ordenados, j´a que o algoritmo tem complexidade de Θ(n) no melhor caso. Con-
siderando que o vetor j´a est´a ordenado, a execuc¸˜ao apenas compara todos os elementos
com o elemento anterior, e n˜ao faz nenhuma troca.
1000 5000 10000 20000 30000 50000
Crescente 0.0 0.0 0.00199 0.00199 0.00419 0.00819
Decrescente 0.02800 0.68200 2.73639 11.41419 24.33819 73.61080
Aleat´orio 0.09866 0.99893 1.36220 5.45020 12.33840 34.30399
Table 1. Tabela de desempenho Insertion sort
No vetor decrescente (pior caso) ocorre o contr´ario do vetor crescente, j´a que a
complexidade ´e de Θ(n2
) o algoritmo compara todos os elementos do vetor com o ele-
mento anterior e faz todas as trocas poss´ıveis, assim o desempenho ca´ı consideravelmente,
por exemplo, no vetor crescente com 50000 elementos o tempo de execuc¸˜ao foi de 0.008
segundos enquanto no decrescente o tempo subiu para 73.61 segundos.
No vetor aleat´orio, que possui desempenho Θ(n2
) foi analisado atrav´es do gr´afico
que o desempenho fica entre o crescente e o decrescente.
Pode-se concluir ent˜ao que o algoritmo insertion sort ´e eficiente apenas para ve-
tores com pequenas entradas, por exemplo, a partir de 10000 elementos o algoritmo j´a se
torna bastante lento em relac¸˜ao a outros algoritmos.
3.2. Selection Sort
O selection sort ´e um algoritmo de ordenac¸˜ao baseado em se passar sempre o menor valor
do vetor para a primeira posic¸˜ao (ou o maior dependendo da ordem requerida), depois o
de segundo menor valor para a segunda posic¸˜ao, e assim ´e feito sucessivamente com os
(n − 1) elementos restantes, at´e os ´ultimos dois elementos.
Figure 2. Gr´afico de desempenho Selection sort
1000 5000 10000 20000 30000 50000
Crescente 0.04000 1.05019 4.53920 21.07679 54.80159 199.60179
Decrescente 0.04400 1.03819 4.84339 22.37839 62.41919 218.79639
Aleat´orio 0.04400 1.028201 4.79580 22.62439 61.91779 158.87400
Table 2. Tabela de desempenho Selection sort
O algoritmo selection sort tem complexidade Θ(n2
) em todos os casos, ent˜ao o
desempenho vai ser bastante parecido em todos os tipos de vetores, com um desempenho
um pouco inferior nos vetores aleat´orios, por exemplo, at´e 30000 elementos o tempo de
execuc¸˜ao do algoritmo ´e praticamente igual independente do tipo de vetor, a diferenc¸a s´o
comec¸a a ser notada a partir de 50000 elementos.
Assim como o algoritmo insertion sort, o selection sort tamb´em s´o se mostra efi-
ciente com vetores com quantidades pequenas de elementos.
3.3. Bubble Sort
O bubble sort, ou ordenac¸˜ao por flutuac¸˜ao, ´e um algoritmo de ordenac¸˜ao dos mais simples.
A ideia ´e percorrer o vetor diversas vezes, a cada passagem fazendo flutuar para o topo
o maior elemento da sequˆencia. Essa movimentac¸˜ao lembra a forma como as bolhas em
um tanque de ´agua procuram seu pr´oprio n´ıvel, e disso vem o nome do algoritmo.
No melhor caso, o algoritmo executa n operac¸˜oes relevantes, onde n representa o
n´umero de elementos do vetor. No pior caso, s˜ao feitas O(n2
) operac¸˜oes. A complexidade
desse algoritmo ´e de ordem quadr´atica. Por isso, ele n˜ao ´e recomendado para programas
que precisem de velocidade e operem com quantidade elevada de dados.
Figure 3. Gr´afico de desempenho Bubble sort
1000 5000 10000 20000 30000 50000
Crescente 0.0 0.0 0.0 0.00533 0.0 0.00500
Decrescente 0.10933 2.32466 9.08533 36.18733 82.94066 237.40766
Aleat´orio 0.06766 1.49266 5.9179 23.69166 54.61099 170.46166
Table 3. Tabela de desempenho Bubble sort
O algoritmo bubble sort possui um desempenho bastante parecido com o algo-
ritmo insertion sort. Analisando o gr´afico nota-se que o tempo de execuc¸˜ao para vetores
crescentes ´e sempre muito baixo, sempre pr´oximo a zero segundos.
No pior caso, quando o vetor ´e decrescente, o algoritmo precisar´a percorrer o
vetor inteiro e ir´a fazer o m´aximo de trocas poss´ıveis, diminuindo consideravelmente o
desempenho.
As posic¸˜oes dos elementos no bubble sort desempenham um papel fundamental
para determinar a performance da execuc¸˜ao do algotimo. Por exemplo, grandes elementos
no in´ıcio da lista n˜ao demonstram um problema t˜ao grande, eles podem ser facilmente
trocados de posic¸˜ao, ao contr´ario de pequenos elementos no final da lista, pois a sua
movimentac¸˜ao para o in´ıcio ser´a muito lenta. Esses tipos de elementos s˜ao chamados de
lebres e tartarugas respectivamente.
Sobre este algoritmo conclui-se que a sua utilizac¸˜ao s´o em vantajosa em vetores
com entradas pequenas e de preferˆencia aleat´orios. O tempo de execuc¸˜ao para vetores
decrescente e consideravelmente maior em relac¸˜ao a vetores aleat´orios e mais ainda em
relac¸˜ao a vetores crescentes.
3.4. Merge Sort
O merge sort, ou ordenac¸˜ao por mistura, ´e um exemplo de algoritmo de ordenac¸˜ao do tipo
dividir-para-conquistar.
Sua id´eia b´asica ´e muito f´acil: criar uma sequˆencia ordenada a partir de duas
outras tamb´em ordenadas. Para isso, ele divide a sequˆencia original em pares de dados,
ordena-as; depois as agrupa em sequˆencias de quatro elementos, e assim por diante, at´e
ter toda a sequˆencia dividida em apenas duas partes.
Os trˆes passos ´uteis dos algoritmos dividir-para-conquistar, que se aplicam ao
merge sort s˜ao:
• Dividir: Dividir os dados em subsequˆencias pequenas;
• Conquistar: Classificar as duas metades recursivamente aplicando o merge sort;
• Combinar: Juntar as duas metades em um ´unico conjunto j´a classificado.
1000 5000 10000 20000 30000 50000
Crescente 0.01566 0.03099 0.06233 0.13533 0.20800 0.36400
Decrescente 0.01033 0.03133 0.08833 0.13533 0.20799 0.36933
Aleat´orio 0.01033 0.03133 0.08333 0.14033 0.21333 0.37433
Table 4. Tabela de desempenho Merge sort
O algoritmo merge sort possui complexidade Θ(n log n) para todos os casos.
Como a estrat´egia do algoritmo consiste em dividir o problema em problemas menores
Figure 4. Gr´afico de desempenho Merge sort
at´e que a soluc¸˜ao seja trivial, o desempenho vai ser o mesmo independente do tipo de
vetor, assim, os desempenhos dos trˆes tipos de vetores s˜ao bastante pr´oximos.
Analisando o gr´afico e as tabelas percebe-se que o tempo de execuc¸˜ao mais lento
no algoritmo merge sort que foi para um vetor aleat´orio de 50000 posic¸˜oes foi de 0.37
segundos, um tempo consideravelmente melhor em relac¸˜ao aos outros algoritmos j´a anal-
isados at´e o momento.
3.5. Heap Sort
Heap sort ´e um m´etodo de ordenac¸˜ao cujo princ´ıpio de funcionamento ´e o mesmo
princ´ıpio utilizado para a ordenac¸˜ao por selec¸˜ao, a saber: selecione o menor item do
vetor e a seguir troque-o com o item que est´a na primeira posic¸˜ao do vetor; repita estas
duas operac¸˜oes com os n − 1 itens restantes, depois com os n − 2 itens, e assim suces-
sivamente. O custo para encontrar o menor (ou o maior) item entre n itens custa n − 1
comparac¸˜oes. [Ziviani 2004]
De acordo com [Ziviani 2004] o algoritmo heap sort possui complexidade
O(n log n) independente da entrada. Esse ´e um limite superior, mas n˜ao ´e assintotica-
mente restrito segundo [Cormen et al. ] que afirma que no melhor caso o desempenho ´e
de Ω(n log n) em todas as situac¸˜oes.
A execuc¸˜ao deste algoritmo de d´a da seguinte forma:
• O primeiro passo ´e construir o heap a partir dos dados.
• Depois disso s˜ao retirados os maiores valores da heap e colocados no novo array
ordenado. Para esse primeiro elemento, ele deve ser a posic¸˜ao 0 do array.
• O pr´oximo passo ´e a reconstruc¸˜ao do heap e a remoc¸˜ao do pr´oximo maior ele-
mento e a inserc¸˜ao deste elemento no array ordenado.
• Depois de removidos todos os elementos da heap, o array est´a ordenado.
A direc¸˜ao dos elementos sorteados pode variar atrav´es da escolha do heap m´ınimo ou
heap m´aximo no primeiro passo.
Figure 5. Gr´afico de desempenho Heap sort
1000 5000 10000 20000 30000 50000
Crescente 0.02066 0.05733 0.10900 0.23900 0.37966 0.65533
Decrescente 0.01566 0.07300 0.11433 0.24966 0.36899 0.63433
Aleat´orio 0.01033 0.06233 0.11433 0.25466 0.36933 0.66566
Table 5. Tabela de desempenho Heap sort
Apesar de o heap sort e o merge sort possu´ırem a mesma complexidade o algo-
ritmo merge sort possui um desempenho um pouco melhor em relac¸˜ao ao heap sort. Por
exemplo para qualquer tipo de vetor com 50000 elementos o algoritmo merge sort executa
quase que na metade do tempo do heap sort.
3.6. Quick Sort
O quick sort ´e um algoritmo de ordenac¸˜ao cujo tempo de execuc¸˜ao do pior caso ´e de Θ(n2
)
sobre um arranjo de entrada de n n´umeros. Apesar desse tempo de execuc¸˜ao lento no pior
caso, o quick sort com frequˆencia ´e a melhor opc¸˜ao pr´atica para ordenac¸˜ao, devido a sua
not´avel eficiˆencia na m´edia: seu tempo de execuc¸˜ao esperado ´e Θ(n lg n), e os fatores
constantes ocultos na notac¸˜ao Θ(n lg n) s˜ao bastante pequenos. Ele tamb´em apresenta
a vantagem da ordenac¸˜ao local e funciona bem at´e mesmo em ambientes de mem´oria
virtual. [Cormen et al. ]
Figure 6. Gr´afico de desempenho Quick sort
1000 5000 10000 20000 30000 50000
Crescente 0.01033 0.02066 0.03133 0.07266 0.08833 0.18699
Decrescente 0.0 0.01566 0.03133 0.06766 0.09366 0.19233
Aleat´orio 0.00533 0.02066 0.04133 0.07799 0.11966 0.21833
Table 6. Tabela de desempenho Quick sort
O algoritmo quick sort ´e de longe o melhor algoritmo de ordenac¸˜ao existente, a sua
execuc¸˜ao dura menos do que a metade do tempo em relac¸˜ao a qualquer outro algoritmo
em qualquer outra condic¸˜ao.
4. Conclus˜ao
Feitas todas as an´alises pode-se concluir que:
• A relac¸˜ao Heap sort / Quick sort se mant´em constante para todos os tamanhos,
sendo o Heap sort mais lento.
• O algoritmo Insertion sort ´e o mais r´apido para qualquer tamanho se os elementos
est˜ao ordenados e ´e o mais lento para qualquer tamanho se os elementos est˜ao em
ordem decrescente.
• Entre os algoritmos de complexidade O(n2
), o insertion sort ´e melhor para todos
os tamanhos aleat´orios experimentados.
References
Cormen, T. H., Leiserson, C. E., Rivest, R. L., and Stein, C. Algoritmos: Teoria e pr´atica.
Campus, 2nd edition.
Ziviani, N. (2004). Projeto de Algoritmos: com implementac¸˜oes em Pascal e C. Cengage
Learning (Thomson / Pioneira), S˜ao Paulo, 1st edition.

Contenu connexe

Tendances

Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
Adriano Teixeira de Souza
 
Trabalho métodos de ordenação
Trabalho métodos de ordenaçãoTrabalho métodos de ordenação
Trabalho métodos de ordenação
Daiana de Ávila
 

Tendances (20)

ICC - Aula 05 - Estrutura de controle, sequencial e condicional
ICC - Aula 05 - Estrutura de controle, sequencial e condicionalICC - Aula 05 - Estrutura de controle, sequencial e condicional
ICC - Aula 05 - Estrutura de controle, sequencial e condicional
 
Bubble Sort
Bubble SortBubble Sort
Bubble Sort
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Algoritmo aula 01-f
Algoritmo   aula 01-fAlgoritmo   aula 01-f
Algoritmo aula 01-f
 
Algoritmos de busca
Algoritmos de buscaAlgoritmos de busca
Algoritmos de busca
 
Análise de Algoritmos - Recursividade
Análise de Algoritmos - RecursividadeAnálise de Algoritmos - Recursividade
Análise de Algoritmos - Recursividade
 
Análise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenaçãoAnálise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenação
 
Estrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas EncadeadasEstrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas Encadeadas
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 
Algoritmos e lp parte 1-introdução
Algoritmos e lp parte 1-introduçãoAlgoritmos e lp parte 1-introdução
Algoritmos e lp parte 1-introdução
 
Aula01 - Logica de Programação
Aula01 - Logica de ProgramaçãoAula01 - Logica de Programação
Aula01 - Logica de Programação
 
Lógica de programação em ppt
Lógica de programação em pptLógica de programação em ppt
Lógica de programação em ppt
 
Algoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registrosAlgoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registros
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 
Introdução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosIntrodução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmos
 
Atividades práticas word
Atividades práticas wordAtividades práticas word
Atividades práticas word
 
Trabalho de algoritmos
Trabalho de algoritmosTrabalho de algoritmos
Trabalho de algoritmos
 
Trabalho métodos de ordenação
Trabalho métodos de ordenaçãoTrabalho métodos de ordenação
Trabalho métodos de ordenação
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 

En vedette

Comparativo bubble sort e quick sort
Comparativo bubble sort e quick sortComparativo bubble sort e quick sort
Comparativo bubble sort e quick sort
Daiana de Ávila
 
Tutorial aed iii 005 - algoritmo de ordenação quicksort
Tutorial aed iii   005 - algoritmo de ordenação quicksortTutorial aed iii   005 - algoritmo de ordenação quicksort
Tutorial aed iii 005 - algoritmo de ordenação quicksort
Flávio Freitas
 

En vedette (20)

Ordenação
OrdenaçãoOrdenação
Ordenação
 
Metodos de ordenação estrutura de dados
Metodos de ordenação   estrutura de dadosMetodos de ordenação   estrutura de dados
Metodos de ordenação estrutura de dados
 
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
 
Análise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasAnálise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de Recorrências
 
métodos ordenação C, bolha, selection sort e insertion sort
métodos ordenação C, bolha, selection sort e insertion sortmétodos ordenação C, bolha, selection sort e insertion sort
métodos ordenação C, bolha, selection sort e insertion sort
 
Cap 01
Cap 01Cap 01
Cap 01
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 
Análise de Algoritmos de Ordenação Interna
Análise de Algoritmos de Ordenação InternaAnálise de Algoritmos de Ordenação Interna
Análise de Algoritmos de Ordenação Interna
 
Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise Assintótica
 
Análise de Algoritmos
Análise de AlgoritmosAnálise de Algoritmos
Análise de Algoritmos
 
01 algorimos e complexidade introduç o
01   algorimos e complexidade introduç o01   algorimos e complexidade introduç o
01 algorimos e complexidade introduç o
 
Comparativo bubble sort e quick sort
Comparativo bubble sort e quick sortComparativo bubble sort e quick sort
Comparativo bubble sort e quick sort
 
Aula analise algoritmos
Aula analise algoritmosAula analise algoritmos
Aula analise algoritmos
 
Análise de algoritmo
Análise de algoritmoAnálise de algoritmo
Análise de algoritmo
 
Análise de Algoritmos - Método Guloso
Análise de Algoritmos - Método GulosoAnálise de Algoritmos - Método Guloso
Análise de Algoritmos - Método Guloso
 
Ordenação de Dados por Distribuição de Chaves
Ordenação de Dados por Distribuição de ChavesOrdenação de Dados por Distribuição de Chaves
Ordenação de Dados por Distribuição de Chaves
 
Algoritmo de Rabin-Karp
Algoritmo de Rabin-KarpAlgoritmo de Rabin-Karp
Algoritmo de Rabin-Karp
 
Aula sobre Tabela Hash
Aula sobre Tabela HashAula sobre Tabela Hash
Aula sobre Tabela Hash
 
Árvores binárias balanceadas
Árvores binárias balanceadasÁrvores binárias balanceadas
Árvores binárias balanceadas
 
Tutorial aed iii 005 - algoritmo de ordenação quicksort
Tutorial aed iii   005 - algoritmo de ordenação quicksortTutorial aed iii   005 - algoritmo de ordenação quicksort
Tutorial aed iii 005 - algoritmo de ordenação quicksort
 

Similaire à Análise de desempenho de algoritmos de ordenação

14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelas
Ricardo Bolanho
 
Tutorial aed iii 004 - algoritmo de ordenação quicksort
Tutorial aed iii   004 - algoritmo de ordenação quicksortTutorial aed iii   004 - algoritmo de ordenação quicksort
Tutorial aed iii 004 - algoritmo de ordenação quicksort
Flávio Freitas
 
Algorítmo estruturado
Algorítmo estruturadoAlgorítmo estruturado
Algorítmo estruturado
Naldo Falaschi
 

Similaire à Análise de desempenho de algoritmos de ordenação (20)

Aulas de estrutura de dados por Ayrton Yagami
Aulas de estrutura de dados por Ayrton YagamiAulas de estrutura de dados por Ayrton Yagami
Aulas de estrutura de dados por Ayrton Yagami
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NAAula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
 
SysSorting Professional
SysSorting ProfessionalSysSorting Professional
SysSorting Professional
 
0001
00010001
0001
 
000003 complexidade
000003 complexidade000003 complexidade
000003 complexidade
 
Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de M...
Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de M...Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de M...
Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de M...
 
Ordenação de pares e ímpares
Ordenação de pares e ímparesOrdenação de pares e ímpares
Ordenação de pares e ímpares
 
Processamento Paralelo exemplo do Crivo de Erstótenes Paralelo e Sequencial
Processamento Paralelo exemplo do Crivo de Erstótenes Paralelo e SequencialProcessamento Paralelo exemplo do Crivo de Erstótenes Paralelo e Sequencial
Processamento Paralelo exemplo do Crivo de Erstótenes Paralelo e Sequencial
 
14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelas
 
Analise Algoritmos
Analise AlgoritmosAnalise Algoritmos
Analise Algoritmos
 
Aula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingAula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic tagging
 
Aula6 programação
Aula6 programaçãoAula6 programação
Aula6 programação
 
Estrutura de Dados Apoio (Complexidade de Algoritmos)
Estrutura de Dados Apoio (Complexidade de Algoritmos)Estrutura de Dados Apoio (Complexidade de Algoritmos)
Estrutura de Dados Apoio (Complexidade de Algoritmos)
 
Pi raciocinio lógico
Pi   raciocinio lógicoPi   raciocinio lógico
Pi raciocinio lógico
 
apostila matlab
apostila matlabapostila matlab
apostila matlab
 
Algoritmo estruturado
Algoritmo estruturadoAlgoritmo estruturado
Algoritmo estruturado
 
Tutorial aed iii 004 - algoritmo de ordenação quicksort
Tutorial aed iii   004 - algoritmo de ordenação quicksortTutorial aed iii   004 - algoritmo de ordenação quicksort
Tutorial aed iii 004 - algoritmo de ordenação quicksort
 
Algorítmo estruturado
Algorítmo estruturadoAlgorítmo estruturado
Algorítmo estruturado
 

Dernier

Dernier (8)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

Análise de desempenho de algoritmos de ordenação

  • 1. An´alise de Desempenho de Algoritmos de Ordenac¸˜ao Gustavo de Carvalho Sales1 1 Departamento de Inform´atica e Estat´ıstica – Universidade Federal do Piau´ı (UFPI) Teresina – PI – Brasil gt.salles@gmail.com Abstract. This paper is intended to evaluate the performance of six sorting al- gorithms of vectors through a software that performs the tests and generates a chart to be analyzed. Also in the article, it will be analyzed the complexity of each algorithm and associated with the result obtained in the tests. Resumo. Este artigo destina-se a avaliar o desempenho de seis algoritmos de ordenac¸˜ao de vetores atrav´es de um software que realiza os testes e gera um gr´afico a ser analisado. Ainda no artigo, ser´a analisada a complexidade de cada algoritmo e esta, associada com o resultado obtido nos testes. 1. Introduc¸˜ao O objetivo desse trabalho ´e realizar a implementac¸˜ao e comparac¸˜ao de desempenho dos principais algoritmos de ordenac¸˜ao existentes. O c´odigo fonte foi escrito na linguagem de programac¸˜ao Python, utilizando as bibliotecas PyQt e Matplotlib para a interface gr´afica e para a criac¸˜ao dos gr´aficos respec- tivamente e a IDE Eclipse. O Computador onde foram desenvolvidos os testes possui a seguinte configurac¸˜ao: • Processador Intel(R) Core(TM) i5-2430M CPU @ 2.40GHz • 4GB de mem´oria RAM com frequˆencia de 1333Mhz • Microsoft Windows 7 Ultimate 64 Bits 2. Especificac¸˜oes O problema consiste em avaliar o desempenho dos seguintes algoritmos de ordenac¸˜ao de vetores: Insertion Sort, Selection Sort, Bubble Sort, Merge Sort, Heap Sort e Quick Sort. A avaliac¸˜ao ´e feita considerando o tempo de execuc¸˜ao dos algoritmos nas seguintes condic¸˜oes: • Vetores crescentes, decrescentes e aleat´orios • O teste ´e realizado cinco vezes e ´e considerado como tempo final a m´edia dos tempos das cinco execuc¸˜oes. • Os algoritmos s˜ao executados para vetores com as seguintes quantidades de ele- mentos: 1000, 5000, 10000, 20000, 30000 e 50000. O software desenvolvido executa uma interface gr´afica onde ´e selecionado o al- goritmo a ser utilizado. Uma vez que a execuc¸˜ao ´e iniciada, todo o resto do processo ´e automatizado, o software executa para o algoritmo selecionado a ordenac¸˜ao dos trˆes tipos de vetores e com as seis quantidades predefinidas. Ao final da execuc¸˜ao, s˜ao gerados trˆes arquivos para cada algoritmo e ´e chamado o m´odulo que constr´oi o gr´afico lendo os arquivos gerados pelo programa.
  • 2. 3. Desenvolvimento Ordenar corresponde ao processo de rearranjar um conjunto de objetos em ordem as- cendente ou descendente. O objetivo principal da ordenac¸˜ao ´e facilitar a recuperac¸˜ao posterior de itens do conjunto ordenado. A ordenac¸˜ao ´e uma operac¸˜ao fundamental em ciˆencia da computac¸˜ao (muitos pro- gramas a utilizam como uma etapa intermedi´aria) e, como resultado, um grande n´umero de bons algoritmos de ordenac¸˜ao tem sido desenvolvido. O melhor algoritmo para uma determinada aplicac¸˜ao depende - entre outros fatores - do n´umero de itens a serem or- denados, da extens˜ao em que os itens j´a est˜ao ordenados de algum modo, de poss´ıveis restric¸˜oes sobre os valores de itens e da esp´ecie de dispositivo de armazenamento a ser usado: mem´oria principal, discos ou fitas [Cormen et al. ]. 3.1. Insertion Sort Insertion sort ´e um algoritmo de ordenac¸˜ao simples, uma ordenac¸˜ao por comparac¸˜ao na qual uma nova lista ´e constru´ıda um valor por vez. Isso ´e muito menos eficiente em grandes listas do que outros algoritmos como quick sort, heap sort ou merge sort. A complexidade do insertion sort no melhor caso ´e de Ω(n) de acordo com [Ziviani 2004], visto que ele ir´a fazer n comparac¸˜oes e ver que o vetor j´a est´a ordenado. No pior caso e no no caso m´edio a complexidade do insertion sort ´e de Θ(n2 ). Figure 1. Gr´afico de desempenho Insertion sort Atrav´es do gr´afico percebe-se o desempenho incrivelmente superior para os ve- tores ordenados, j´a que o algoritmo tem complexidade de Θ(n) no melhor caso. Con- siderando que o vetor j´a est´a ordenado, a execuc¸˜ao apenas compara todos os elementos com o elemento anterior, e n˜ao faz nenhuma troca.
  • 3. 1000 5000 10000 20000 30000 50000 Crescente 0.0 0.0 0.00199 0.00199 0.00419 0.00819 Decrescente 0.02800 0.68200 2.73639 11.41419 24.33819 73.61080 Aleat´orio 0.09866 0.99893 1.36220 5.45020 12.33840 34.30399 Table 1. Tabela de desempenho Insertion sort No vetor decrescente (pior caso) ocorre o contr´ario do vetor crescente, j´a que a complexidade ´e de Θ(n2 ) o algoritmo compara todos os elementos do vetor com o ele- mento anterior e faz todas as trocas poss´ıveis, assim o desempenho ca´ı consideravelmente, por exemplo, no vetor crescente com 50000 elementos o tempo de execuc¸˜ao foi de 0.008 segundos enquanto no decrescente o tempo subiu para 73.61 segundos. No vetor aleat´orio, que possui desempenho Θ(n2 ) foi analisado atrav´es do gr´afico que o desempenho fica entre o crescente e o decrescente. Pode-se concluir ent˜ao que o algoritmo insertion sort ´e eficiente apenas para ve- tores com pequenas entradas, por exemplo, a partir de 10000 elementos o algoritmo j´a se torna bastante lento em relac¸˜ao a outros algoritmos. 3.2. Selection Sort O selection sort ´e um algoritmo de ordenac¸˜ao baseado em se passar sempre o menor valor do vetor para a primeira posic¸˜ao (ou o maior dependendo da ordem requerida), depois o de segundo menor valor para a segunda posic¸˜ao, e assim ´e feito sucessivamente com os (n − 1) elementos restantes, at´e os ´ultimos dois elementos. Figure 2. Gr´afico de desempenho Selection sort
  • 4. 1000 5000 10000 20000 30000 50000 Crescente 0.04000 1.05019 4.53920 21.07679 54.80159 199.60179 Decrescente 0.04400 1.03819 4.84339 22.37839 62.41919 218.79639 Aleat´orio 0.04400 1.028201 4.79580 22.62439 61.91779 158.87400 Table 2. Tabela de desempenho Selection sort O algoritmo selection sort tem complexidade Θ(n2 ) em todos os casos, ent˜ao o desempenho vai ser bastante parecido em todos os tipos de vetores, com um desempenho um pouco inferior nos vetores aleat´orios, por exemplo, at´e 30000 elementos o tempo de execuc¸˜ao do algoritmo ´e praticamente igual independente do tipo de vetor, a diferenc¸a s´o comec¸a a ser notada a partir de 50000 elementos. Assim como o algoritmo insertion sort, o selection sort tamb´em s´o se mostra efi- ciente com vetores com quantidades pequenas de elementos. 3.3. Bubble Sort O bubble sort, ou ordenac¸˜ao por flutuac¸˜ao, ´e um algoritmo de ordenac¸˜ao dos mais simples. A ideia ´e percorrer o vetor diversas vezes, a cada passagem fazendo flutuar para o topo o maior elemento da sequˆencia. Essa movimentac¸˜ao lembra a forma como as bolhas em um tanque de ´agua procuram seu pr´oprio n´ıvel, e disso vem o nome do algoritmo. No melhor caso, o algoritmo executa n operac¸˜oes relevantes, onde n representa o n´umero de elementos do vetor. No pior caso, s˜ao feitas O(n2 ) operac¸˜oes. A complexidade desse algoritmo ´e de ordem quadr´atica. Por isso, ele n˜ao ´e recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados. Figure 3. Gr´afico de desempenho Bubble sort
  • 5. 1000 5000 10000 20000 30000 50000 Crescente 0.0 0.0 0.0 0.00533 0.0 0.00500 Decrescente 0.10933 2.32466 9.08533 36.18733 82.94066 237.40766 Aleat´orio 0.06766 1.49266 5.9179 23.69166 54.61099 170.46166 Table 3. Tabela de desempenho Bubble sort O algoritmo bubble sort possui um desempenho bastante parecido com o algo- ritmo insertion sort. Analisando o gr´afico nota-se que o tempo de execuc¸˜ao para vetores crescentes ´e sempre muito baixo, sempre pr´oximo a zero segundos. No pior caso, quando o vetor ´e decrescente, o algoritmo precisar´a percorrer o vetor inteiro e ir´a fazer o m´aximo de trocas poss´ıveis, diminuindo consideravelmente o desempenho. As posic¸˜oes dos elementos no bubble sort desempenham um papel fundamental para determinar a performance da execuc¸˜ao do algotimo. Por exemplo, grandes elementos no in´ıcio da lista n˜ao demonstram um problema t˜ao grande, eles podem ser facilmente trocados de posic¸˜ao, ao contr´ario de pequenos elementos no final da lista, pois a sua movimentac¸˜ao para o in´ıcio ser´a muito lenta. Esses tipos de elementos s˜ao chamados de lebres e tartarugas respectivamente. Sobre este algoritmo conclui-se que a sua utilizac¸˜ao s´o em vantajosa em vetores com entradas pequenas e de preferˆencia aleat´orios. O tempo de execuc¸˜ao para vetores decrescente e consideravelmente maior em relac¸˜ao a vetores aleat´orios e mais ainda em relac¸˜ao a vetores crescentes. 3.4. Merge Sort O merge sort, ou ordenac¸˜ao por mistura, ´e um exemplo de algoritmo de ordenac¸˜ao do tipo dividir-para-conquistar. Sua id´eia b´asica ´e muito f´acil: criar uma sequˆencia ordenada a partir de duas outras tamb´em ordenadas. Para isso, ele divide a sequˆencia original em pares de dados, ordena-as; depois as agrupa em sequˆencias de quatro elementos, e assim por diante, at´e ter toda a sequˆencia dividida em apenas duas partes. Os trˆes passos ´uteis dos algoritmos dividir-para-conquistar, que se aplicam ao merge sort s˜ao: • Dividir: Dividir os dados em subsequˆencias pequenas; • Conquistar: Classificar as duas metades recursivamente aplicando o merge sort; • Combinar: Juntar as duas metades em um ´unico conjunto j´a classificado. 1000 5000 10000 20000 30000 50000 Crescente 0.01566 0.03099 0.06233 0.13533 0.20800 0.36400 Decrescente 0.01033 0.03133 0.08833 0.13533 0.20799 0.36933 Aleat´orio 0.01033 0.03133 0.08333 0.14033 0.21333 0.37433 Table 4. Tabela de desempenho Merge sort O algoritmo merge sort possui complexidade Θ(n log n) para todos os casos. Como a estrat´egia do algoritmo consiste em dividir o problema em problemas menores
  • 6. Figure 4. Gr´afico de desempenho Merge sort at´e que a soluc¸˜ao seja trivial, o desempenho vai ser o mesmo independente do tipo de vetor, assim, os desempenhos dos trˆes tipos de vetores s˜ao bastante pr´oximos. Analisando o gr´afico e as tabelas percebe-se que o tempo de execuc¸˜ao mais lento no algoritmo merge sort que foi para um vetor aleat´orio de 50000 posic¸˜oes foi de 0.37 segundos, um tempo consideravelmente melhor em relac¸˜ao aos outros algoritmos j´a anal- isados at´e o momento. 3.5. Heap Sort Heap sort ´e um m´etodo de ordenac¸˜ao cujo princ´ıpio de funcionamento ´e o mesmo princ´ıpio utilizado para a ordenac¸˜ao por selec¸˜ao, a saber: selecione o menor item do vetor e a seguir troque-o com o item que est´a na primeira posic¸˜ao do vetor; repita estas duas operac¸˜oes com os n − 1 itens restantes, depois com os n − 2 itens, e assim suces- sivamente. O custo para encontrar o menor (ou o maior) item entre n itens custa n − 1 comparac¸˜oes. [Ziviani 2004] De acordo com [Ziviani 2004] o algoritmo heap sort possui complexidade O(n log n) independente da entrada. Esse ´e um limite superior, mas n˜ao ´e assintotica- mente restrito segundo [Cormen et al. ] que afirma que no melhor caso o desempenho ´e de Ω(n log n) em todas as situac¸˜oes. A execuc¸˜ao deste algoritmo de d´a da seguinte forma: • O primeiro passo ´e construir o heap a partir dos dados. • Depois disso s˜ao retirados os maiores valores da heap e colocados no novo array ordenado. Para esse primeiro elemento, ele deve ser a posic¸˜ao 0 do array.
  • 7. • O pr´oximo passo ´e a reconstruc¸˜ao do heap e a remoc¸˜ao do pr´oximo maior ele- mento e a inserc¸˜ao deste elemento no array ordenado. • Depois de removidos todos os elementos da heap, o array est´a ordenado. A direc¸˜ao dos elementos sorteados pode variar atrav´es da escolha do heap m´ınimo ou heap m´aximo no primeiro passo. Figure 5. Gr´afico de desempenho Heap sort 1000 5000 10000 20000 30000 50000 Crescente 0.02066 0.05733 0.10900 0.23900 0.37966 0.65533 Decrescente 0.01566 0.07300 0.11433 0.24966 0.36899 0.63433 Aleat´orio 0.01033 0.06233 0.11433 0.25466 0.36933 0.66566 Table 5. Tabela de desempenho Heap sort Apesar de o heap sort e o merge sort possu´ırem a mesma complexidade o algo- ritmo merge sort possui um desempenho um pouco melhor em relac¸˜ao ao heap sort. Por exemplo para qualquer tipo de vetor com 50000 elementos o algoritmo merge sort executa quase que na metade do tempo do heap sort. 3.6. Quick Sort O quick sort ´e um algoritmo de ordenac¸˜ao cujo tempo de execuc¸˜ao do pior caso ´e de Θ(n2 ) sobre um arranjo de entrada de n n´umeros. Apesar desse tempo de execuc¸˜ao lento no pior caso, o quick sort com frequˆencia ´e a melhor opc¸˜ao pr´atica para ordenac¸˜ao, devido a sua not´avel eficiˆencia na m´edia: seu tempo de execuc¸˜ao esperado ´e Θ(n lg n), e os fatores constantes ocultos na notac¸˜ao Θ(n lg n) s˜ao bastante pequenos. Ele tamb´em apresenta
  • 8. a vantagem da ordenac¸˜ao local e funciona bem at´e mesmo em ambientes de mem´oria virtual. [Cormen et al. ] Figure 6. Gr´afico de desempenho Quick sort 1000 5000 10000 20000 30000 50000 Crescente 0.01033 0.02066 0.03133 0.07266 0.08833 0.18699 Decrescente 0.0 0.01566 0.03133 0.06766 0.09366 0.19233 Aleat´orio 0.00533 0.02066 0.04133 0.07799 0.11966 0.21833 Table 6. Tabela de desempenho Quick sort O algoritmo quick sort ´e de longe o melhor algoritmo de ordenac¸˜ao existente, a sua execuc¸˜ao dura menos do que a metade do tempo em relac¸˜ao a qualquer outro algoritmo em qualquer outra condic¸˜ao. 4. Conclus˜ao Feitas todas as an´alises pode-se concluir que: • A relac¸˜ao Heap sort / Quick sort se mant´em constante para todos os tamanhos, sendo o Heap sort mais lento. • O algoritmo Insertion sort ´e o mais r´apido para qualquer tamanho se os elementos est˜ao ordenados e ´e o mais lento para qualquer tamanho se os elementos est˜ao em ordem decrescente. • Entre os algoritmos de complexidade O(n2 ), o insertion sort ´e melhor para todos os tamanhos aleat´orios experimentados.
  • 9. References Cormen, T. H., Leiserson, C. E., Rivest, R. L., and Stein, C. Algoritmos: Teoria e pr´atica. Campus, 2nd edition. Ziviani, N. (2004). Projeto de Algoritmos: com implementac¸˜oes em Pascal e C. Cengage Learning (Thomson / Pioneira), S˜ao Paulo, 1st edition.