Trabalho Prático: Heap or Quick

Feito por Lucas Mazurkievicz Sekikawa e Aaron Moura

Ministrada pelo professor Elias Procópio Duarte Jr.

Documentos do Programa

Decidimos modularizar as funções do programa principal, para facilitar a compreensão do algoritmo, ficando com esses arquivos:

Log dos testes

Nesse arquivo .txt está o log do nosso programa:

Relatório

Relatório do trabalho prático da matéria Algoritmos e Estruturas de Dados II redigida pelo professor Elias P. Duarte Jr.

O relatório segue o modelo “diário” como indicado pelo professor.

Metodologia

O nosso vetor estático inicial era dessa forma:

Vetor zerado

À medida que o usuário ia adicionando pacientes, a estrutura do vetor ficava dessa forma:

Vetor com 1 paciente

A função para imprimir o vetor, imprime apenas as structs que estavam em estado inicial (com nome NULL e prioridade zerada). Caso, o usuário insira algum paciente no vetor, ele é inserido seguindo a ordem do que seria um Min Heap, pois no nosso caso quanto menor o valor absoluto, maior a prioridade. Por exemplo: Se eu quiser adicionar um paciente com prioridade 5 (menor prioridade que 2) o paciente é inserido após o de prioridade maior.

Vetor com 2 pacientes

Implementação das Funções

Contagem de Trocas e Comparações

Essa foi, sem dúvida, uma das partes mais trabalhosas do projeto. Não porque fosse difícil encontrar onde as trocas e comparações aconteciam, mas sim por entender o que realmente deveria ser contado. As trocas foram a parte mais simples, já que o padrão delas é bem característico: sempre envolvem o uso de uma variável auxiliar para armazenar temporariamente um valor antes da substituição. Isso deixou fácil identificar todos os pontos do código onde uma troca acontecia.

As comparações, por outro lado, geraram mais dúvida. No começo, parecia que bastava contar todos os if e as condições dentro dos while. Mas, quando olhamos mais de perto, percebemos que nem todas as comparações realmente dizem respeito à ordenação em si. Por exemplo, condições como while (i > 1) ou if (esq < dir) apenas controlam o fluxo do programa, sem comparar elementos do vetor.

Depois de pesquisar e discutir bastante, chegamos à conclusão de que existe uma diferença entre a parte teórica e a prática da análise de algoritmos. Na prática, toda comparação é de fato executada e consome tempo, mas, teoricamente, o foco da análise está nas comparações que influenciam o resultado da ordenação — ou seja, aquelas que envolvem diretamente os valores do vetor.

Por isso, optamos por seguir o ponto de vista teórico e contar apenas as comparações que realmente participam do processo de ordenação. As condições de controle, como as de parada ou de limite de laço, não foram incluídas. Assim, nossa contagem reflete melhor a lógica do algoritmo e permite comparar de forma mais justa o comportamento entre diferentes métodos de ordenação.

Com esse critério definido, padronizamos a forma de medir as comparações e trocas em todos os algoritmos, garantindo que os resultados fossem consistentes e focados no que realmente importa: o custo lógico da ordenação.