Pesquisa e Ordenação 0.0.1
Projeto estuda pesquisa: sequencial e binária; ordenação: selectsort e quicksort.
Alessandro Elias, GRR20110589, ae11@inf.ufpr.br
Ruanito Diego Santos, GRR20114691, rds11@inf.ufpr.br

TRABALHO PRÁTICO II: ORDENAÇÃO E PESQUISA

Introdução

Este trabalho foi desenvolvido com o mesmo intuito do trabalho I, ou seja, seguimos a mesma idéia de modularização e também manter um código robusto, apesar de o intuito deste trabalho é somente estudarmos a eficiência de algoritmos de ordenação e busca. A dupla decidiu que é uma boa prática de programação sempre desenvolvermos códigos robustos. A interface com o usuário ficou divido: centralizado título e um menu a esquerda com 8 espaços de margem. Assim que o programa é iniciado um vetor com 512 elementos é gerado aleatóriamente, desordenado e podendo haver elementos repetidos. Há um segundo vetor que armazena o vetor ordenado, porém ao iniciar o programa contem lixo de memória, uma vez ordenado estará na memória o vetor original gerado aleatórimente e uma cópia ordenado. Por convenção da dupla, o índice zero do vetor foi reservado para a busca sequencial com sentinela, portanto elementos válidos estão entre 1 e 512 em ambos os vetores. A impressão do vetor tanto no terminal quanto no log foi feita na forma de matriz linha e coluna, elas estão numeradas, assim a intentificação de um elemento fica mais simples, compacta e limpa.

MODULARIZAÇÃO

O código foi dividido em 6 módulos:

  • sortui.c (Gerencia toda interação com o usuário).
  • buscasequencial.c (Módulo somente com o algoritmo de busca sequencial).
  • buscabinária.c (Módulo somente com o algoritmo de busca binária).
  • selectsort.c (Algoritmo de ordenção select sort. O bug no número de permutações foi corrigido).
  • quicksort.c (Algoritmo implementado).
  • log.c (Módulo gerencia a criação de arquivos de log).
  • Makefile (Arquivo de compilação).

Tarball com todos os módulos acima mencionado.

Tarball com quick sort.

OBS: Quick sort será implementado de forma eficiente ao retorno das aulas, apesar disso este já esta funcional, apenas com o pivô ineficiente. Passe para o make CFLAGS=INCLUDE_QUICK_SORT, assim o módulo com o quick sort será incluso. O programa deve ser linkado com curses, pois utilizamos algumas chamadas para cetralizar menu e greeting da interface com o usuário.

CÁCULO DO DESVIO PADRÃO

Devido o cálculo da variância necessitar da média das comparações (V = (somatório (Xi - MÉDIA)²) / N fórmula do cálculo da variância. N=nº de elementos) salvamos em um vetor todos os números de comparações e então de cada iésimo elemento do vetor subtraímos da média e elevamos ao quadrado. Os mil casos que foram analizados foram gerados aleatótiamente, tanto o vetor quanto elementos a serem pesquisados. Somente utilizamos a técnica do acumulador para cálculo da média dos mil casos. Não é possível acumular o quadrado da diferença entre Xi - MÉDIA, pois não temos de antemão MÉDIA, logo precisamos calcular a média dos 1000 casos e então podemos calcular a variância e consequentemente desvio padrão, DP = sqrt(V). Por isso cada número de comparações foi armazenado em um vetor.

LOG's

Alguns arquivos de log que demonstram o comportamento do programa.

  1. Consula vetor com elemento aleatório.
  2. Consulta vetor com elemento entrado pelo usuário.
  3. Ordenação select sort.
  4. Média e desvio padrão, 1000 casos.
  5. Gera, Consulta, Ordena e Desvio Padrão.
Log's com o algoritmo quick sort, e bug do select sort fixed.

  1. Consula vetor com elemento aleatório.
  2. Consulta vetor com elemento entrado pelo usuário.
  3. Ordenação select sort e quick sort.
  4. Média e desvio padrão, 1000 casos.
  5. Gera, Consulta, Ordena e Desvio Padrão.

CONCLUSÃO

Concluímos deste trabalho que sem sobra de dúvida a busca binária é muito superior que a busca a sequencial, porém com o custo da ordenação, pois a busca binária demanda o vetor estar ordenado em ordem crescente ou decrescente. A conclusão matemática pode ser obeservada através do desvio padrão 99.999...% dos casos a busca binária se manteve mais regular, enquanto a busca sequencial é muito irregular. O algoritmo de ordenação selectsort é 100% regular, porém ineficiente (como podemos observar seu desvio padrão), pois não importa quanto próximo ordenado está o vetor no início da ordenação o selectsort sempre fará N(N-1) / 2 comparações, em nosso caso N = 512, portanto 512*(512-1) / 2 = 130816 comparações, sempre. O que o torna um método de ordenação nada eficiente. Aquardaremos a comparação com o quicksort, que é um método muito mais eficiente.

O quick sort foi implementado, porém estudamos (referência bibliogáfica Programer's Bible Jamsa's) que escolhendo o pivo no meio do vetor e com um pouco de sorte ele se torna um bom pivo, potencializando o desempenho. Pudemos observar que o quick sort e bem irregular segundo a métrica permutações. Ja o select sort após correção do bug ele se mostrou 100% regular, conforme prova matematica ele faz N-1 permutações, porém o quick sort com um bom pivo tem melhor desempenho.
 Tudo Estruturas de dados Ficheiros Funções Variáveis Definições de tipos Enumerações Valores da enumeração Macros