Você está na página 1de 9

Um estudo comparativo entre os algoritmos de ordenação

Matheus P. Castro1 , Romário da C. Silva1 ,


1
Faculdade de Computação – Universidade Federal do Pará (UFPA)
68746-630 – Castanhal – PA – Brazil
{matheusmano13,eng.romariosilva}@gmail.com

Abstract. With the exponential growth of the amount of data, retrieving a spe-
cific data has become an increasingly frequent problem. Therefore, the use
of ordering algorithms becomes essential to organize a given linear structure,
whether physical or not. This work describes a brief comparative study on the
main algorithms of ordering and their respective efficiencies. For this, an expe-
rimental study is performed through the JAVA language simulation to obtain the
main metrics that validate the efficiency of the algorithms.

Resumo. Com o crescimento exponencial da quantidade de dados, recuperar


um dado especı́fico tem se tornado um problema cada vez mais frequente. Por-
tanto, o uso dos algoritmos de ordenação torna-se imprescindı́vel para se or-
ganizar uma determinada estrutura linear, seja ela fı́sica ou não. Este traba-
lho descreve um breve estudo comparativo sobre os principais algoritmos de
ordenação e suas respectivas eficiências. Para tanto, realiza-se um estudo ex-
perimental atráves da simulação em linguagem JAVA para obtenção das princi-
pais métricas que validam a eficiência dos algoritmos.

1. Introdução
Este estudo visa realizar um comparativo entre os resultados obtidos na aplicação dos al-
goritmos de ordenação Bubble Sort, Insertion Sort, Selection Sort, Binary Insertion Sort,
Merge Sort, Quick Sort, Heap Sort e Bucket Sort, bem como, suas respectivas utilidades e
eficiências. Para realizar essa análise, foi realizado um teste com três vetores de tamanhos
diferentes para cada algoritmo e, os dados coletados foram comparados. Os testes foram
realizados apenas com algarismos numéricos inteiros (sequências de números) a fim de
obtermos dados quantitativos que facilitem o entendimento da análise posterior.

2. Algoritmos de Ordenação
Os métodos de ordenação constituem em artifı́cios para a resolução de tarefas utilizando
computadores. As técnicas de ordenação permitem verificar como cada algoritmo se com-
porta quando executado. Dependendo da aplicação, cada algoritmo considerado possui
uma vantagem particular sobre os outros algoritmos.
Nesse contexto, os algoritmos de ordenação são algoritmos que direcionam para
a organização ou reordenação de valores apresentados em uma dada sequência, ou seja,
consistem no processo de rearranjar um conjunto de objetos em ordem ascendente ou
descendente. A ordenação visa facilitar a recuperação posterior de itens do conjunto
ordenado de forma mais eficiente.
2.1. BubbleSort

Este algoritmo apresenta a maior simplicidade de implementação


[Szwarcfiter and Markenzon 1994]. Seu funcionamento ocorre por meio da comparação
entre dois elementos, caso o segundo seja menor que o primeiro, troca suas posições, de
modo que o elemento de maior valor fique à direita do outro [Pereira 2018].

2.2. InsertionSort

É um método simples que consiste em partir de uma parcela dos elementos a serem orde-
nados e que a cada interação vai caminhando para organizar uma parcela maior da lista e
que somente na última interação é que analisará a lista como um todo.
Segundo [Júnior 2014], como principais aspectos negativos desse algoritmo cabe
registrar que:

• o fato do arquivo já estar ordenado não ajuda em nada, pois o custo continua
quadrático;
• o algoritmo não é estável, pois ele nem sempre deixa os registros com chaves
iguais na mesma posição relativa.

2.3. SelectionSort

O algoritmo de ordenação por seleção é um dos métodos de ordenação mais simples


existente e é de fácil implementação. Esse método consiste, em cada etapa, em selecionar
o maior (ou o menor) elemento e alocá-lo em sua posição correta dentro da futura lista
ordenada. Durante a execução, a lista com n registros é decomposta em duas sublistas,
uma contendo os itens já ordenados e a outra com os elementos ainda não ordenados.
No inı́cio, a sublista ordenada está vazia e a desordenada contém todos os elementos, no
final do processo a sublista ordenada apresentará (n-1) elementos e a desordenada terá um
elemento [Júnior 2014].

2.4. BinaryInsertioSort

Este algoritmo é uma variação do Insertion Sort, na qual o local apropriado para inserir
o elemento selecionado é encontrado usando a pesquisa binária. A utilização da pesquisa
binária auxilia na redução do número de comparações obtidas pelo Insertion Sort. Deste
modo, exigindo menos custo computacional e um menor tempo para execução.

2.5. QuickSort

Segundo [Ziviani 2007], o método de ordenação QuickSort é considerado como um dos


métodos mais rápidos. O algoritmo utiliza a ideia de dividir e conquistar para trocar
elementos distantes. Seu método consiste em selecionar primeiramente um dos elementos
do conjunto a ordenar para ser o elemento pivô, e que é um elemento já ordenado, em
seguida faz uma subdivisão do conjunto inicial em dois subconjuntos, onde o primeiro
subconjunto conterá todos os elementos menores que o elemento escolhido, o pivô, e o
segundo subconjunto com todos os elementos maiores que o pivô [Júnior et al. 2014].
2.6. MergeSort

Este algoritmo tem como objetivo a reordenação de uma estrutura linear por meio da
quebra, intercalação e união dos n elementos existentes, ou seja, a estrutura a ser re-
ordenada será, de forma recursiva, subdividida em estruturas menores até que não seja
mais possı́vel fazê-lo. Logo em seguida, os elementos serão organizados de modo
que cada subestrutura ficará ordenada. Feito isso, as subestruturas menores (agora
ordenadas) serão unidas, sendo seus elementos ordenados por meio de intercalação
[Szwarcfiter and Markenzon 1994]. O mesmo processo repete-se até que todos os ele-
mentos estejam unidos em uma única estrutura organizada.

2.7. HeapSort

É um método de ordenação desenvolvido em 1964 por John W. J. Williams para melhorar


o desempenho do método de ordenação por seleção, que é ineficiente (O(n2)comparações)
mas que tem como vantagem fazer poucas movimentações. O seu funcionamento baseia-
se no uso de heap binário (ordenação por árvore binária). Inicialmente, insere-se os ele-
mentos da lista num heap binário crescente. Em seguida, faz-se sucessivas remoções do
menor elemento do heap, colocando os elementos removidos do heap de volta na lista. A
lista estará então em ordem crescente.

2.8. BucketSort

Um exemplo de ordenação por distribuição é o algoritmo bucket sort (ordenação balde).


Esse algoritmo cria “baldes” com valores atribuı́dos a estes, esses baldes receberão os
números referente ao seu valor depois estes são “esvaziados” seguindo a ordem. A ideia
do método é dividir o intervalo que vai de 0 até k em n subintervalos de mesmo tamanho.
Cada subintervalo estará associado a uma lista ligada que irá conter os elementos da lista
que pertencem àquele subintervalo. Por exemplo, se a lista tem oito elementos é o maior
deles é 100, teremos 10 intervalos: [0, 10), [10, 20), ..., [90, 101). A posição zero do
bucket apontará para uma lista encadeada que irá conter os elementos da lista que são
maiores ou iguais a zero e menores que 10, e assim por diante.

3. Metodologia
A Linguagem Java foi definida como meio de codificação para a realização dos testes e
a IDE NetBeans como ambiente de desenvolvimento. Adicionalmente, desenvolveu-se
uma interface gráfica (JFrame) na IDE para melhor compreensão e análise dos resultados
obtidos em cada algoritmo. Quanto ao hardware, a máquina em que os testes foram
executados tem as seguintes configurações:

• Fabricante: Dell;
• Modelo: Inspiron 15 Série 3000;
• Processador: Intel(R) Core(TM) i5-7200U;
• Frequência: 2,5 GHz;
• Memória RAM: 4,00 GB (DDR4 2.400MHz);
• Sistema Operacional: Windows 10 Home Single Language (64 bits).
3.1. Testes

Após codificação dos algoritmos, foram utilizados como entrada vetores aleatórios, sendo
copiados para os códigos a partir de 3 arquivos com extensão .txt, a fim de garantir que
os mesmos valores fossem utilizados em todas as medidas. O comprimento dos vetores
foram: 5000, 10000 e 20000 elementos. Ademais, verificou-se o tempo de execução para
todos os métodos, utilizando cada comprimento como entrada.

4. Experimento e Análise dos Algoritmos de Ordenação

Neste trabalho foi possı́vel verificar experimentalmente a complexidade computacional


de 8 algoritmos de ordenação: Bubble Sort, Quick Sort, Merge Sort, Insertion Sort, Bi-
nary Insertion Sort, Selection, Heap Sort e Bucket Sort. Nos sutópicos abaixo é possı́vel
visualizar a quantidade de trocas, compações e o tempo de execução de cada algoritmo
para os vetores com 5000, 10000 e 20000 elementos.

4.1. BubbleSort

Como as atividades mais custosas computacionalmente são as comparações e trocas, res-


pectivamente, pode-se concluir que este algoritmo, por realizar um elevado número de
comparações, apresenta um alto custo computacional. Na figura 1, é demonstrando a
quantidade de comparações, trocas e o tempo de execução deste algoritmo para cada ve-
tor, validando a relação de custo computacional pelo tempo de execução.

(a) Quantidade de comparações e trocas (b) Tempo de execução

Figura 1. Resultados obtidos na execução do algoritmo Bubble Sort

4.2. InsertionSort

Na figura 2, é demonstrando a quantidade de comparações, trocas e o tempo de execução


deste algoritmo para cada vetor. Vale ressaltar que foram obtidos os mesmos valores de
trocas e comparações do Bubble Sort. No entanto, o tempo de execução apresentou uma
diferença significativa.
(a) Quantidade de comparações e trocas (b) Tempo de execução

Figura 2. Resultados obtidos na execução do algoritmo Insertion Sort

4.3. SelectionSort

Na figura 3, é demonstrando a quantidade de comparações, trocas e o tempo de execução


deste algoritmo para cada vetor. Sendo que o resultado obtido com maior destaque foi o
número extremamente baixo de trocas, impactando diretamente no seu tempo de execução
total.

(a) Quantidade de comparações e trocas (b) Tempo de execução

Figura 3. Resultados obtidos na execução do algoritmo Selection Sort

4.4. BinaryInsertioSort

Na figura 4, é demonstrando a quantidade de comparações, trocas e o tempo de execução


deste algoritmo para cada vetor. Como esperado, o número de comparações reduziu dras-
ticamente se comparado ao Insertion Sort, e por consequência ocorreu a redução no tempo
de execução.
(a) Quantidade de comparações e trocas (b) Tempo de execução

Figura 4. Resultados obtidos na execução do algoritmo Binary Insertion Sort

4.5. QuickSort
Ao rearranjar os dados de modo que as dados ”menores”precedam os dados ”maiores”e
em seguida ordenar as duas sublistas de dados menores e maiores recursivamente até que a
lista completa se encontre ordenada, obtém-se como resultado um baixo número de trocas
e comparações, além de um valor ı́nfimo para o tempo de execução. Tal situação, pode
ser confirmada na figura 5, onde é demonstrando a quantidade de comparações, trocas e
o tempo de execução deste para cada vetor.

(a) Quantidade de comparações e trocas (b) Tempo de execução

Figura 5. Resultados obtidos na execução do algoritmo Quick Sort

4.6. MergeSort
O seu funcionamento é similar ao Quick Sort, no entanto, para o pior caso (dados de-
sordenados) e para um grande quantidade de dados, o mesmo se sobressai ao apresen-
tar uma complexidade n log n. Conforme figura 6, através da análise da quantidade de
comparações, trocas e o tempo de execução obtidos para cada vetor é possı́vel perceber a
diferença com o algoritmo Quick Sort.
(a) Quantidade de comparações e trocas (b) Tempo de execução

Figura 6. Resultados obtidos na execução do algoritmo Merge Sort

4.7. HeapSort
O grande diferencial do Heap Sort é que apresenta um desempenho em tempo de execução
muito bom em conjuntos ordenados aleatoriamente e o no pior cenário é praticamente
igual ao desempenho em cenário médio. Conforme figura 7, é possı́vel identificar, com os
resultados obtidos, um desempenho superior aos algoritmos Bubble Sort, Insertion Sort,
Binary Insertion Sort e Selection Sort.

(a) Quantidade de comparações e trocas (b) Tempo de execução

Figura 7. Resultados obtidos na execução do algoritmo Heap Sort

4.8. BucketSort
A partir da divisão de um vetor em um número finito de recipientes (baldes). Onde cada
recipiente é então ordenado individualmente, usando um algoritmo de ordenação dife-
rente, neste estudo foi utilizado o Insertion Sort, ou usando o algoritmo bucket sort recur-
sivamente. É garantido ao algoritmo uma complexidade linear Θ (n), reduzindo a quanti-
dade de trocas, comparações e tempo de execução consideravelmente conforme exposto
na figura 8.
(a) Quantidade de comparações e trocas (b) Tempo de execução

Figura 8. Resultados obtidos na execução do algoritmo Bucket Sort

5. Conclusões
É possı́vel identificar que o comportamento dos métodos de ordenação varia conforme o
tamanho de entrada, onde a eficiência dos métodos está relacionada ao tempo de execução,
ao número de comparações e também a quantidade de trocas a serem efetuadas. Os al-
goritmos estudados foram implementados e executados para uma sequência de listas de
tamanho variado, iniciando com 5000 e chegando a 20000 elementos na lista maior. A
relação entre os tempos de execução estão apresentados na figura a seguir.

Figura 9. Tempo de execução de todos os algoritmos do estudo

O Bubble Sort e o Insertion Sort demonstraram-se como os algoritmos com os


maiores tempos e os maiores números de comparações, sendo o Bubble Sort o que apre-
sentou o maior tempo dentre estes. Portanto, em todos os casos ambos se mostraram
algoritmos ineficientes.
O binary Insertion Sort apresentou um número de comparações inferior compa-
rado ao Insertion Sort, e consequentemente um tempo de execução menor, garatindo assim
uma maior eficiência se comparado ao Insertion sort em todos casos.
O Selection Sort apresentou um número bem reduzido de trocas comparado, mas
ainda permaneceu com a mesma quantidade de comparações dos algoritmos anteriores.
Em geral, o seu tempo de execução foi inferior ao anteriores, o que proprorcionou uma
eficiência moderada ao algoritmo.
O algoritmo Heap Sort utiliza-se da ordenação por árvore binária e apresentou va-
lores moderadamente baixos e semelhantes de comparações e trocas, tal fato proporciona
uma maior eficiência ao algortimo em comparação aos anteriores.
Por fim, concluı́-se que os algoritmos Quick Sort, Merge Sort e Bucket Sort
apresentaram um desempenho superior aos métodos mais simples, com reduções con-
sideráveis nos seus tempos de execução. Isto se deve ao fato destes algoritmos utilizarem
técnicas que reduzem o vetor em análise a cada iteração, com menor número de trocas e
algoritmos mais otimizados, utilizando até mesmo de recursividade. Entretanto, o Buc-
ket Sort se sobressaiu como algoritmo com os menores valores de comparações, trocas e
tempo de execução, e consequetemente, apresentou a maior eficiência dentre os 8 algorit-
mos estudados.

Referências
Júnior, C. D. d. F., Alencar, F., and Júnior, W. M. P. (2014). Métodos de ordenação: a
importância da escolha do método correto. Intercursos revista cientı́fica, 13.
Júnior, W. M. P. (2014). Análise de algoritmos.
Pereira, S. D. L. (2018). Algoritmos e Lógica de Programação em C–Uma Abordagem
Didática. Editora Saraiva.
Szwarcfiter, J. L. and Markenzon, L. (1994). Estruturas de Dados e seus Algoritmos,
volume 2. Livros Técnicos e Cientı́ficos.
Ziviani, N. (2007). Projeto de algoritmos com implementação e c++ e java. THOMPSON
Learning, São Paulo, 1st edição.

Você também pode gostar