Este repositório contém todos os artefatos relacionados ao meu Trabalho de Conclusão de Curso (TCC) em Engenharia da Computação focado na análise de desempenho de algoritmos de ordenação (Bubblesort, Insertionsort, Selectionsort, QuickSort, MergeSort e HeapSort) implementados em C, C++ e Python.
O projeto é dividido em duas frentes de análise:
- Análise Quantitativa (Performance): Medição do tempo de execução dos algoritmos com diferentes tamanhos de entrada (vetores de 100 a 1.000.000 de elementos), com 100 repetições para cada cenário.
- Análise Qualitativa (Legibilidade): Pesquisa com alunos para avaliar a facilidade de entendimento e implementação nas respectivas linguagens de programação.
O repositório está organizado nas seguintes pastas para facilitar a navegação e compreensão da metodologia:
-
/Algoritmos: Contém as implementações dos algoritmos de ordenação nas linguagens C, C++ e Python. Cada subpasta de linguagem armazena os códigos-fonte e os respectivos executáveis responsáveis por gerar os arquivos
.csvde performance. -
/Analise: Abriga o Jupyter Notebook (
.ipynb) principal. Este notebook é responsável por importar os dados da pasta/Resultados, consolidar tudo em um DataFrame e gerar as análises estatísticas e visualizações (gráficos de linha, box plots, etc.). -
/Apoio: Armazena materiais de consulta, artigos e referências teóricas utilizadas durante o desenvolvimento do trabalho.
-
/Executores: Contém os scripts de automação (arquivos
.bash) utilizados para executar os testes em lote, garantindo que todos os algoritmos sejam rodados sob as mesmas condições e gerando os arquivos de resultado de forma padronizada. -
/Resultados: Armazena os dados brutos de performance gerados pelos executáveis. Os dados estão em formato
.csv, separados em subpastas por linguagem, e prontos para ser consumidos pelo notebook de análise. -
/Validações: Inclui um conjunto de testes e códigos auxiliares. O objetivo desta pasta é validar as implementações, assegurando que os algoritmos estão, de fato, ordenando os vetores corretamente antes da medição de performance.
-
/Vetores: Contém o script responsável por gerar os vetores de entrada e os próprios arquivos de vetores utilizados nos testes, garantindo que todos os algoritmos sejam aplicados aos os mesmos dados.
-
README.md: Este arquivo.
Esta seção descreve o passo a passo metodológico da execução do projeto, desde a preparação dos dados até a análise final.
Antes de qualquer execução, foi necessário criar uma base de dados consistente para os testes.
- Criação dos Vetores: Foi utilizado o script na pasta
/Vetorespara gerar os conjuntos de dados. Para cada tamanho (ex: 100, 1.000, 1.000.000), foram criados 100 vetores distintos com elementos em ordem aleatória. - Armazenamento: Esses vetores foram salvos, garantindo que todos os algoritmos, em todas as linguagens, fossem testados com os mesmos 100 conjuntos de dados de entrada para cada tamanho.
Os seis algoritmos (BubbleSort, InsertionSort, SelectionSort, MergeSort, HeapSort e QuickSort) foram implementados nas linguagens C, C++ e Python. Os códigos-fonte completos estão disponíveis na pasta /Algoritmos.
Antes de medir o tempo de execução, foi executada uma etapa de validação das implementações. Este processo foi feito em duas etapas e está contido na pasta /Validações:
- Execução de Teste: Cada algoritmo foi executado utilizando um conjunto de vetores de teste de tamanho 100. O resultado de cada ordenação foi salvo em um arquivo de saída.
- Verificação Automatizada: Foi desenvolvido um script Python que, após a execução dos algoritmos, lia todos os arquivos de saída gerados. Este script verificava a ordenação de cada vetor (garantindo que
vetor[i] <= vetor[i+1]para todos os elementos) e emitia um relatório final, confirmando se todas as implementações estavam ordenando os vetores de teste corretamente.
Com os algoritmos validados e os vetores prontos, a coleta de performance foi automatizada.
- Scripts de Execução: Os arquivos
.bashna pasta/Executoresforam criados para automatizar todo o processo de teste. - Execução em Lote: Cada script executou os algoritmos (da pasta
/Algoritmos) aplicando os vetores gerados (da pasta/Vetores). - Coleta Estatística: A execução consistiu consistiu em ordenar os 100 vetores diferentes de cada tamanho, um de cada vez.
- Medição: O tempo de execução de cada uma dessas 100 ordenações foi cronometrado individualmente.
- Exportação: Ao final do processo, o programa salvou os 100 tempos medidos em um único arquivo
.csv(ex:resultados_quick_sort_c.csv), contendo colunas comoLinguagem,Algoritmo,Tamanho,TempoeRepeticao(ondeRepeticaode 1 a 100 indica o índice do vetor testado). - Armazenamento: Esses arquivos
.csvforam salvos diretamente na pasta/Resultados.
Toda a análise dos dados de performance foi centralizada no Jupyter Notebook localizado na pasta /Analise.
- Carregamento: O notebook primeiro localiza e carrega dinamicamente todos os arquivos
.csvdas pastas/Resultados/C,/Resultados/C++e/Resultados/Python. - Unificação: Os dados de todos os arquivos são concatenados em um único DataFrame (usando a biblioteca Pandas).
- Agregação: Os dados brutos (agora representando 100 execuções em vetores distintos) são agrupados para calcular estatísticas descritivas, como o tempo médio, mediana e desvio padrão para cada cenário (ex: C++, QuickSort, Tamanho 1.000.000).
- Análise: Com os dados tratados e agregados, são gerados os gráficos comparativos (usando Matplotlib e Seaborn) para responder às perguntas do TCC.
- [Edmagno Gomes dos Santos] - [edamgnogomes@gmail.com]