Anda di halaman 1dari 19

EXPERIMENTOS COM MÉTODOS DE ORDENAÇÃO

CARLOS HENRIQUE, JOSÉ OLIVEIRA,RAYNE LINHARES


YURI SEABRA, LARISSA BEZERRA
1
Escola de Arquitetura, Engenharia  e TI ­ Centro Universitário do Norte ­ UNINORTE
Av. Getúlio Vargas, 730 - Centro, Manaus - AM, 69020-220

chddo1@hotmail.com, joseholiveirah@hotmail.com, rayne.fer@gmail.com,


yuri97real@gmail.com, larissa.magalhaes@uninorte.com.br

Abstract.
An algorithm that orders a set, usually represented in a vector, is called the sort algorithm.
Algorithm of ordering in computer science is an algorithm that puts the elements of a given
sequence in a certain order in other words, makes its ordering complete or partial. The most used
orders are numeric and lexicographic. There are several reasons to order a sequence. One is the
possibility of accessing your data more efficiently. This study aims to evaluate, through
experimentation, the data generated using the ordering algorithms Bubble Sort, Insertion Sort,
Selection Sort, Merge Sort and Quick Sort, as well as their utilities and efficiencies.

Resumo.
Um algoritmo que ordena um conjunto, geralmente representada num vetor, é chamado de
algoritmo de ordenação. Algoritmo de ordenação em ciência da computação é um algoritmo que
coloca os elementos de uma dada sequência em uma certa ordem em outras palavras, efetua sua
ordenação completa ou parcial. As ordens mais usadas são a numérica e a lexicográfica. Existem
várias razões para se ordenar uma sequência. Uma delas é a possibilidade se acessar seus dados de
modo mais eficiente. Este estudo objetiva-se avaliar, por meio de experimentação, os dados gerados
com a utilização dos algoritmos de ordenação Bubble Sort, Insertion Sort, Selection Sort, Merge
Sort e Quick Sort, bem como, suas utilidades e eficiências.

1. Introdução

Este estudo objetiva-se em avaliar, por meio de experimentação, os dados gerados com a
utilização dos algoritmos de ordenação Bubble Sort, Insertion Sort, Selection Sort, Merge Sort,
Quick Sort, bem como, suas respectivas utilidades e eficiências. Para tanto, são executados três
testes com três vetores de tamanhos diferentes para cada algoritmo, utilizando como parâmetro o
número de comparações realizadas por cada algoritmo, no qual também será gerado um gráfico
contendo o numero médio. Apesar de ser possível a implementação dos algoritmos de ordenação
com qualquer estrutura linear, optamos por realizar os testes 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.
Podem ser encontrados trabalhos similares existem na literatura–(FOLATOR et al., 2014),
(HONORATO, 2013), (SILVA, 2010), (TELLES et al.,2015), (YANG et al., 2011) –, mas,estes não
relacionam os mesmos 5 algoritmos referidos neste artigo
Os vetores utilizados tem como tamanho 5, 10, e 50, gerando dentre eles 50 vetores inteiros
aleatoriamente, no qual serão avaliados pela ordenação de cada um dos dos métodos propostos e a
contagem do numero de comparações entre os elementos em cada ordenação realizada. Com os
resultados espera-se apontar as vantagens e desvantagens ao se fazer uso de um algoritmo em
detrimento de outro.
Os algoritmos de ordenação apresentados de forma breve terão como uso neste estudo seus
respectivos código em Linguagem C.

2. DESENVOLVIMENTO

Ordenação é o ato de se colocar os elementos de uma sequência de informações, ou dados,


em uma relação de ordem predefinida. O termo técnico em inglês para ordenação é sorting, cuja
tradução literal é “classificação”.
Algoritmos de ordenação são algoritmos que direcionam para a ordenação, ou reordenação,
de valores apresentados em uma dada sequência, para que os dados possam ser acessados
posteriormente de forma mais eficiente. Uma das principais finalidades desse tipo de algoritmo é a
ordenação de vetores, uma vez que, em uma única variável pode-se ter inúmeras posições, a
depender do tamanho do vetor declarado. Por exemplo, a organização de uma lista de presença
escolar para que a relação fique organizada em ordem alfabética.

2.1. Bubble Sort

O Bubble Sort é um dos algoritmos mais simples de ordenação, o qual, em linhas gerais,
funciona passando repetidamente por meio dos elementos a ser classificados, segue comparando
cada par dos elementos adjacentes e realiza a troca desses elementos caso estejam na ordem errada.
A verificação dos elementos a ser ordenados continua repetidamente até que não precise fazer mais
nenhuma troca. Isso indica que os elementos estão então ordenados
2.2. Insertion Sort

O Insertion Sort é de fácil implementação, similar ao Bubble Sort (SZWARCFITER e


MARKENZON, 2015). Seu funcionamento se dá por comparação e inserção direta. A medida que o
algoritmo varre a lista de elementos, o mesmo os organiza, um a um, em sua posição mais correta,
onde o elemento a ser alocado (k) terá, a sua esquerda um valor menor (k-1), e, de maneira similar,
à sua direita um valor maior (k+1).

2.3. Selection Sort

O Selection Sort utiliza um o conceito de "selecionar o elemento mais apto". Ele seleciona o
menor ou maior valor do vetor e passa para a primeira (ou última posição dependendo da ordem
requerida), depois o segundo menor para a segunda posição e assim sucessivamente com (n-1)
elementos restantes até os dois últimos.
2.4. Merge Sort

O algoritmo Merge Sort é um exemplo de algoritmo de ordenação do tipo dividir e


conquistar. Sua ideia básica consiste em dividir (o problema em vários subpartes e resolvê-las por
meio da recursividade) e conquistar (após todas essas subpartes terem sido resolvidos ocorre a
conquista que é a união das resoluções). Como o algoritmo do Merge Sort usa a recursividade em
alguns problemas, essa técnica não é muito eficiente devido ao alto consumo de memória e tempo
de execução.
A ideia básica desse método é dividir para conquistar. Um vetor ou conjunto de dados é
dividido, recursivamente, até que cada subconjunto possua 1 elemento. Depois, vai combinando e
comparando 2 subconjuntos de forma a obter 1 conjunto maior e rearranjado. E isso se repete até se
formar o conjunto original novamente, porém, ordenado. Este método consome muita memória por
causa das chamadas recursivas.

2.4.1 Dificuldades

O algoritmo foi implementado em:


- DEV c++, no Windows 10
- Codeblocks, no Ubuntu 16.04 com Unity.
Para o método em questão, o Codeblocks mostrou instabilidades para vetores com
mais de 7 posições preenchidas e mostrava muitos lixos de memória no final da execução. O
problema pôde ser contornado, usando um vetor auxiliar simples na função “merge”. Diferente da
implementada no DEV que era alocada na memória com malloc e não apresentava problema
nenhum.

Usamos as funções rand e srand para gerar os valores aleatórios (Figura 1). O rand gera uma
sequência de valores que se repete igual a si própria sempre que o programa é executado. Para que
esses valores aleatórios mudem em cada inicialização do programa, usamos o srand que muda os
valores de acordo com o relógio do sistema, em segundos.
2.5. Quick Sort

O Quick Sort usa do mesmo princípio de divisão que o Merge Sort, entretanto, o mesmo não
utiliza a intercalação, uma vez que não subdivide a dada estrutura em muitas menores. Esse
algoritmo simplesmente faz uso de um dos elementos da estrutura linear (determinada pelo
programador) como parâmetro inicial, denominado pivô. Com o pivô definido, o algoritmo irá
dividir a estrutura inicial em duas, a primeira, à esquerda, contendo todos os elementos de valores
menores que o pivô, e, à direita, todos os elementos com valores maiores. Em seguida, o mesmo
procedimento é realizado com o a primeira lista (valoresmenores<pivô<valoresmaiores). O mesmo
processo se repete até que todos os elementos estejam ordenados(SZWARCFITER e
MARKENZON, 2015.
3. RESULTADO E DISCUSSÕES

A Linguagem C foi definida como meio de codificação para a realização das simulações e a
IDE Code Blocks como ambiente de desenvolvimento. Quanto ao hardware, a máquina em que os
testes foram executados tem as seguintes configurações:

● Fabricante: Samsung Eletronics;


● Modelo: NP300E56;
● Processador: Intel(R) Celerom(R) Dual Core;
● Frequência: 1,8 GHz;
● Memória RAM: 4,00 GB (DDR4);
● Sistema Operacional: Windows 10 Home (64 bits) e Ubuntu 16.04 Xenial com Unity (Amd64).

3.1 Como foram gerados os vetores aleatórios;

Figura 1: Gerando Vetores com Valores Aleatórios

Usamos as funções rand e srand para gerar os valores aleatórios (Figura 1). O rand gera uma
sequência de valores que se repete igual a si própria sempre que o programa é executado. Para que
esses valores aleatórios mudem em cada inicialização do programa, usamos o srand que muda os
valores de acordo com o relógio do sistema, em segundos.

3.2 Como foram adaptados os algoritmos para realizar a contagem do número de


comparações:

Foi utilizada a análise do rastreamento por meio de anotações e desenhos. No código


usamos uma variável global, “comparações”, como contador. Em cada função de ordenação, onde
havia estruturas de decisões onde um elemento do vetor era comparado com outro, independente de
haver troca ou não, a nossa variável fazia um pós incremento “comparações++”.

3.3 O que foi desenvolvido para que cada algoritmo ordenasse os mesmos vetores que os
demais:

Criamos um vetor global e uma função onde o vetor global copiava os elementos do vetor
local em suas respectivas posições antes de serem ordenadas, dessa forma o vetor poderia ser
ordenado e depois voltar ao seu estado original, apenas copiando os elementos do vetor global para
o vetor local novamente. Assim foi possível ordenar o mesmo vetor com os 5 métodos.
3.4 Teste de ordenação com vetor de 5 posições :
3.5 Teste de ordenação com vetor de 10 posições:
3.6 Teste de ordenação com vetor de 50 posições:
3.7 GRÁFICOS.

Gráfico 1: MÉDIA DE COMPARAÇÕES EM VETORES DE TAMANHO 5


Gráfico 2: MÉDIA DE COMPARAÇÕES EM VETORES DE TAMANHO 10

Gráfico 3: MÉDIA DE COMPARAÇÕES EM VETORES DE TAMANHO 50


4. CONCLUSÃO

O algoritmo Bubble Sort, além de ser o de mais fácil implementação, não apresenta
resultados satisfatórios, principalmente no número de comparações. A ineficiência desse algoritmo
pode ser traduzida como um grande consumo de processamento, o que, para máquinas com poucos
(ou limitados) recursos computacionais, resulta em lentidão e longos períodos de espera. Sua
aplicação é, na opinião dos autores, indicada somente para fins educacionais, visto que um projeto
com o mesmo pode ser considerado ineficiente e/ou fraco (SILVA, 2010).
O Insertion Sort, por sua vez, é útil para estruturas lineares pequenas, geralmente entre 8 e
20 elementos, sendo amplamente utilizados em sequências de 10 elementos, tendo ainda, listas
ordenadas de forma decrescente como pior caso, listas em ordem crescente como o melhor caso e,
as demais ordens como sendo casos medianos. Sua principal vantagem é o pequeno número de
comparações, e, o excessivo número de trocas, sua desvantagem. Como exemplo de uso, tem-se a
ordenação de cartas de um baralho.

O Selection Sort torna-se útil em estruturas lineares similares ao do Insertion Sort, porém,
com o número de elementos consideravelmente maior, já que, o número de trocas é muito inferior
ao número de comparações, consumindo, assim, mais tempo de leitura e menos de escrita. A
vantagem de seu uso ocorre quando se trabalha com componentes em que, quanto mais se escreve,
ou reescreve, mais se desgasta, e, consequentemente, perdem sua eficiência, como é o caso das
memórias EEPROM e FLASH.

Ambos os algoritmos (Insertion Selection), apesar de suas diferentes características, são


mais comumente utilizados em associação com outros algoritmos de ordenação, como os Merge
Sort, Quick Sort e o Shell Sort, que tendem a subdividir as listas a serem organizadas em listas
menores, fazendo com que sejam mais eficientemente utilizados.

O Merge Sort apresenta-se, em linhas gerais, como um algoritmo de ordenação mediano.


Devido a recursividade ser sua principal ferramenta, seu melhor resultado vem ao lidar com
estruturas lineares aleatórias. Entretanto, ao lidar com estrutura pequenas e/ou já pré-ordenada
(crescente ou decrescente), a recursividade passa a ser uma desvantagem, consumindo tempo de
processamento e realizando trocas desnecessárias. Esse algoritmo é indicado para quando se lida
com estruturas lineares em que a divisão em estruturas menores sejam o objetivo, como, por
exemplo, em filas para operações bancárias.

O algoritmo Quick Sort, ao subdividir o vetor e fazer inserções diretas utilizando um valor
de referência (pivô), reduz seu tempo de execução, mas, as quantidades de comparações (leitura) e,
principalmente, trocas (escrita) ainda são muito altas. Apesar disso, o Quick Sort se apresenta uma
boa opção para situações em que o objetivo é a execução em um menor tempo, mesmo que para
isso haja um detrimento em recursos computacionais de processamento.

O Shell Sort, baseado nos dados deste trabalho, é o que apresenta os resultados mais
satisfatórios, principalmente com estruturas maiores e desorganizadas. Por ser considerado uma
melhoria do Selection Sort, o Shell Sort, ao ser utilizado com as mesmas finalidades que seu
predecessor – recursos que demandem pouca escrita – irá apresentar um melhor desempenho, e,
consequentemente, expandir a vida útil dos recursos.
5. REFERÊNCIAS

Honorato, B. (2013). "Algoritmos de ordenação: análise e comparação."


http://www.devmedia.com.br/algoritmos-de-ordenacao-analise-ecomparacao/28261, abril.

Szwarcfiter, J. L. and Markezon, L. (2015). “Estruturas de Dados e Seus Algoritmos.” 3ª edição.


Rio de Janeiro. LTC.

https://www.kelvinsantiago.com.br/ordenacao-com-selection-sort-insertion-sort-bubble-sort-merge-
sort-quick-sort-heap-sort-em-java/

https://pt.wikibooks.org/wiki/Algoritmos_e_Estruturas_de_Dados/Algoritmos_de_Ordena
%C3%A7%C3%A3o

Anda mungkin juga menyukai