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.