Você está na página 1de 19

Escola Politécnica da Pontifícia Universidade Católica de Goiás

Goiânia, 02 de dezembro de 2021

Estrutura de Dados

Professor: Rafael Leal Martins

Estudante: Lucas Bastos de Souza

Proposta do Trabalho.

Você deve pesquisar sobre os três algoritmos citados acima, e criar um ranking
de eficiência (tabela), classificando-os do melhor para o pior algoritmo. Justifique sua
resposta.

Na disciplina de Estrutura de Dados, estudamos alguns métodos de ordenação de


dados, distinguíveis entre Métodos Simples – dos quais destacamos neste trabalho o
BubbleSort e o InsertionSort – e Métodos Eficientes – dos quais destacamos o QuickSort.
Para avaliar a eficiência destes algoritmos, utilizaremos predominantemente o critério da
complexidade de tempo de suas respectivas execuções, ignorando a complexidade da
implementação e manutenção do código. Podemos apresentar a síntese desta avaliação
utilizando a tabela disponível na obra “Estrutura de Dados” (Matheus da Silva Serpa e
SAGAH – Soluções Educacionais Integradas), apresentada abaixo:
Ao considerar que cada algoritmo terá de avaliar e iterar uma lista, até que ela se
encontre como ordenada, devemos ter em mente que as listas podem estar desordenadas
em diferentes graus, isto é, variando no máximo de desordem possível (e implicando no
maior número de iterações do algoritmo) até o mínimo de desordem possível, quando a
lista já está ordenada. Tendo isto em mente, podemos concluir que a disposição dos
elementos na lista interferirá na performance do algoritmo, fazendo-se mais razoável a
avaliação pela complexidade média de tempo.

Assim, podemos avaliar que, em ordem de eficiência segundo a complexidade


média do tempo do algoritmo, os métodos mais eficientes são entre os propostos pelo
escopo da atividade são, em tese:

I. QuickSort, sendo o método mais eficiente;


II. BubbleSort ou InsertionSort, sendo indiferentes entre si tanto no caso
médio, quanto nos melhores e piores casos;

Esta constatação é feita pois o método do QuickSort presume a divisão do vetor


via pivô, implementando a técnica da “divisão para a conquista”. Ao possuir este
comportamento e a recursividade em sua implementação, o algoritmo divide as tarefas de
forma mais eficiente ao reduzir o tamanho dos vetores ao serem comparados, provocando
uma redução na quantidade de comparações. Já os métodos BubbleSort e InsertionSort,
ao não dividirem o vetor, percorrem-no repetidas vezes para ordenar adequadamente os
elementos, provocando uma queda na eficiência do algoritmo quando comparado ao
QuickSort ou algum outro algoritmo considerado como Método Eficiente de Ordenação.

Desenvolvimento e Testes.

Utilizando o trabalho como justificativa para experimentar os três modelos de


ordenamento, desenvolveu-se o código sorting.py, contendo os métodos de ordenamento,
e o código party.py, aplicando o ordenamento em matrizes, com o intuito de verificar o
tempo de ordenamento dos métodos BubbleSort, InsertionSort e QuickSort.
Figura 1 - Definição do Método BubbleSort

Figura 2 - Definição do Método InsertionSort

Figura 3 - Definição do Método QuickSort

Devido às limitações de equipamento, o teste foi realizado para vetores de


tamanhos sortidos, contendo números inteiros aleatórios de 1 a 500.000. Os tamanhos
selecionados para inspeção foram 100, 300, 500, 700, 900 e 10.000, respectivamente e os
resultados de três testes são colocados abaixo.

Figura 4 - Resultado 01 em segundos

Figura 5 - Resultado 02 em segundos

Figura 6 - Resultado 03 em segundos

Conclusão.

Por último, utilizamos os três casos (distintos) para criar uma tabela de valores
médios para ordenamento, possibilitando a conclusão de que, apesar de a bibliografia
indicar um grau de eficiência, salienta-se que os Modelos Simples podem superar os
Métodos Eficientes eventualmente e em dadas circunstâncias.

Figura 7 - Médias dos Resultados


Apêndices.

Além do código party.py (apêndice), desenvolveu-se o código


party_versao_dois.py, com a possibilidade de solicitar ao usuário o tamanho da matriz a
ser ordenada pelos três métodos propostos, conservando as propriedades do intervalo
numérico inteiro de um a 500.000. Este código também será disponibilizado,
juntamente aos logs de resultados utilizados para a formulação do trabalho.

Você também pode gostar